【问题标题】:Elastic Spring Data OR Java High Level REST Client?Elastic Spring Data 还是 Java 高级 REST 客户端?
【发布时间】:2023-04-08 21:39:01
【问题描述】:

我是 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 似乎在创建简单查询方面做得很好,但在这种情况下对我有帮助吗? 任何建议都将不胜感激。 谢谢!

【问题讨论】:

    标签: java elasticsearch spring-data-elasticsearch elasticsearch-java-api


    【解决方案1】:

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

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

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

    编辑:

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

    【讨论】:

    • 如果我正确理解了文档,Spring 在响应方面很有帮助,因为它提供了 SearchHit 和 SearchHits,但如果您感兴趣的是聚合部分,您仍然需要编写代码来解析响应的那部分,对吗? link
    【解决方案2】:

    我建议您使用 Elastic 正在积极开发的 official Java-high-level rest-client,您还可以查看它支持的所有 the queries builders(它为几乎所有查询提供了查询构建器)。

    此外,以前 Elasticsearch 还没有 JAVA 的官方客户端,但现在他们已经有了并积极改进和开发,恕我直言,您应该继续使用他们,因为它还提供了许多开箱即用的选项,并且谁比谁更了解 Elasticsearch它背后的公司:)

    【讨论】:

    • Spring Data Elasticsearch 使用 Elasticsearch 的 Rest Highlevel 客户端并使用 Elasticsearch 查询构建器。
    • @PJMeisch 感谢您的评论,太好了,如果他们愿意,spring-data-es 的用户将能够直接使用其余高级客户端,我想答案是肯定的,只是想确认你是 spring-data 的提交者:)
    猜你喜欢
    • 2020-10-06
    • 2013-10-30
    • 2018-03-03
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    相关资源
    最近更新 更多