当前位置: 首页 > 知识库问答 >
问题:

弹性Spring数据或Java高级REST客户端?

罗乐意
2023-03-14

我对弹性搜索和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高级REST客户端哪个最适合这种情况?Spring data elasticsearch在创建简单查询方面似乎做得很好,但在这种情况下它能帮助我吗?任何建议都将不胜感激。谢谢

共有2个答案

朱兴安
2023-03-14

我建议您使用正式的Java高级rest客户端,该客户端正在Elastic积极开发,您还可以查看它支持的所有查询生成器(几乎所有查询都有查询生成器)。

同样,以前Elasticsearch没有JAVA的官方客户端,但现在他们已经有了,并且正在积极地改进和开发,我想你应该继续使用他们,因为它还提供了很多现成的选项,并且比支持它的公司更了解Elasticsearch:)

唐康安
2023-03-14

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访问ES。

 类似资料:
  • 我们不允许寻求书籍、工具、软件库等推荐的问题。你可以编辑这个问题,以便用事实和引用来回答。 我是弹性搜索的初学者,正在寻找将弹性搜索与Spring boot相结合的最佳方式。 我不确定使用以下哪一项:- > Spring数据弹性搜索 开玩笑 谢谢

  • 在es中搜索时,如何使用spring的rest模板或elasticsearch自己的高/低rest客户端,我左右为难。与spring rest模板相比,es客户端是否提供了HTTP连接池、性能等方面的任何优势。这两个模板中的哪一个在从服务器获取响应时花费的时间更少。请有人解释一下?

  • 通过以下命令,我可以查看弹性搜索部署的endpoint,并且从Postman那里没有任何问题:GET https://:@d97215aee2.us-east-1.aws.found.io:9243 我也可以使用邮递员的这个命令创建索引...将https://el弹力:4yqimxfosz9mxpgy1fj7t5bu@d97218f74f6d48489b355dd7d665aee2.us-east

  • 我正在尝试将我的弹性搜索(6.6.1)、spring boot(2.1.3)应用程序从Java8迁移到Java11。之前,我使用高级java rest客户端创建和搜索索引。因为存在一个问题(https://github.com/elastic/elasticsearch/issues/38299)在模块化高级rest客户端api时,我试图使用低级rest客户端,但无法获得任何搜索结果。 请看一些代

  • 我有一个在spring boot应用程序中创建弹性搜索索引的代码。目前使用的客户端是transport客户端,它现在根据弹性搜索文档进行折旧,现在被高级Rest客户端取代。 用于使用高级Rest客户端创建索引。我见过这个代码。 这里的fieldsMapping是一个json文件,它包含有关analyzer、tokenizer和filter的详细信息,并作为字符串传递给这个方法。我无法在java r

  • 我正在尝试从ElasticSearch 2过渡到5或6。我想我想直接跳到6.1.1并使用RestHighLevelClient,因为它比低级rest客户端更接近我正在使用的现有传输客户端。 但是,我遇到了一个问题作为集成测试的一部分,我正在创建索引并插入特定数据,因此我知道我的查询是正确的。我似乎无法在High Level客户端中做到这一点。特别是,我希望能够调用: 但是,client.indic