首页 > 解决方案 > Elastic Spring Data 还是 Java 高级 REST 客户端?

问题描述

我是 Elasticsearch 和 Spring 的新手。我编写了一个 Javascript POC,它将 JSON 字符串转换为 Elasticsearch 查询(并执行请求)。它需要一个这样的字符串:

{
    "period": "years",
    "format": "xml",
    "criteria": {
        "operator": "OR",
        "operands": [
            {
                "operator": "AND",
                "operands": [
                    {
                        "operator": "exists",
                        "field": "def"
                    },
                    {
                        "operator": "includes",
                        "field": "keywords",
                        "value": [
                            "abcd"
                        ]
                    }
                ]
            },
            {
                "operator": "AND",
                "operands": [
                    {
                        "operator": "from",
                        "field": "links",
                        "value": 1
                    },
                    {
                        "operator": "includes",
                        "field": "keywords",
                        "value": [
                            "abcd",
                            "efgh"
                        ]
                    }
                ]
            }
        ]
    }
}

(注意:此查询可能有任何级别的嵌套)

...并将其转换为:

{
    "query": {
      "constant_score": {
        "filter": {
          "bool": {
            "should": [
              {
                "bool": {
                  "must": [
                    {
                      "bool": {
                        "must": [
                          {
                            "exists": {
                              "field": "def"
                            }
                          },
                          {
                            "range": {
                              "effectiveDate": {
                                "gte": 1543982400,
                                "lt": 1575518400
                              }
                            }
                          }
                        ]
                      }
                    },
                    {
                      "bool": {
                        "must": [
                          {
                            "terms": {
                              "keywords.name": [
                                "abcd",
                                "efgh"
                              ]
                            }
                          },
                          {
                            "range": {
                              "effectiveDate": {
                                "gte": 1543982400,
                                "lt": 1575518400
                              }
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "bool": {
                        "must": {
                          "terms": {
                            "links": [
                              11048,
                              34618,
                              34658
                            ]
                          }
                        }
                      }
                    },
                    {
                      "bool": {
                        "must": [
                          {
                            "terms": {
                              "keywords.name": [
                                "abcd",
                                "efgh"
                              ]
                            }
                          },
                          {
                            "range": {
                              "effectiveDate": {
                                "gte": 1543982400,
                                "lt": 1575518400
                              }
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    },
    "size": 0,
    "aggs": {
      "by_id": {
        "composite": {
          "sources": [
            {
              "agg_on_id": {
                "terms": {
                  "field": "id"
                }
              }
            }
          ],
          "size": 10000,
          "after": {
            "agg_on_id": -1
          }
        },
        "aggs": {
          "latest_snapshot": {
            "top_hits": {
              "sort": [
                {
                  "effectiveDate": "desc"
                }
              ],
              "_source": true,
              "size": 1
            }
          }
        }
      }
    }
  }

它首先为第一次访问 Elasticsearch 创建一个查询(类似于上面),以提取构建此查询所需的一些信息(“链接”)。每次访问 Elasticsearch 可能会返回数百万个结果,因此它使用“search_after”机制进行分页。我需要将此 POC 转换为 Spring 应用程序。

问题:哪一个最适合这种情况 - Spring Data Elasticsearch 或 Elasticsearch Java High Level REST Client?Spring data elasticsearch 似乎在创建简单查询方面做得很好,但在这种情况下对我有帮助吗?任何建议都将不胜感激。谢谢!

标签: javaelasticsearchspring-data-elasticsearchelasticsearch-java-api

解决方案


Spring Data Elasticsearch 使用 Elasticsearch 提供的高级客户端进行非反应式实现。

您也可以将 Elasticsearch 中的查询构建器与 Spring Data Elasticsearch 一起使用,这为您提供了最大的灵活性。

Spring Data Elasticsearch 将实体映射(POJO 到 JSON)、存储库函数和来自 Spring Data 的其他东西放在上面。因此,您是否应该选择其中一个不是问题,而是您是否需要或想要使用 Spring Data Elasticsearch 提供的附加功能。

编辑:

使用 Spring Data Elasticsearch 时,您配置使用的RestHighLevelClient(请参阅文档),然后将其注入您的其他 Spring bean。因此,您甚至可以混合使用 Spring DataElasticsearchOperations或 Repositories 访问 ES 和RestHighLevelClient直接使用访问。


推荐阅读