【问题标题】:what is the equivalent PercolateQueryBuilder in spring data elastic search?春季数据弹性搜索中等效的 PercolateQueryBuilder 是什么?
【发布时间】:2021-08-30 15:45:00
【问题描述】:

底线 - 如何将我的简单过滤器查询转换为弹簧数据弹性搜索?任何线索表示赞赏。谢谢

我一直在尝试使用弹簧数据弹性搜索编写以下渗透查询

"query": {
    "percolate": {
      "field": "query",
      "document": {
        "message": "A new bonsai tree in the office"
      }
    }
  }

我试过了

Criteria criteria = new Criteria("query").is(

            new Criteria("percolate")
                                .is(
                                        new Criteria("field").is("query")
                                                .and("document")
                                                .is(new Criteria("message").is(text))
                                )
    );

试过

Query query = new StringQuery(String.format("{\n" +
                "  \"query\": {\n" +
                "    \"percolate\": {\n" +
                "      \"field\": \"query\",\n" +
                "      \"document\": {\n" +
                "        \"message\": \"%s\"\n" +
                "      }\n" +
                "    }\n" +
                "  }\n" +
                "}",text));

也尝试过 NativeSearchQuery,但都没有奏效。

我看到 https://tothepoint.group/matching-documents-with-elasticsearch-percolator-query/ 作者使用 PercolateQueryBuilder (https://github.com/ophalsp/elasticsearch-percolator) 但我在 spring 数据弹性搜索中没有看到 PercolateQueryBuilder。

编辑:- 我尝试了所有实现 QueryBuilder 的构建器。由于它们都没有在 XContentBuilder 构建器中查询或渗透(如下所示),因此它们不起作用

protected void doXContent(XContentBuilder builder, Params params) throws IOException {
        builder.startObject("query");

我还可以看到 PercolateQueryBuilder 是 percolator-client 的一部分,它是 org.elasticsearch.client.transport 的一部分,在 spring-boot 中被排除

<dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-elasticsearch</artifactId>
      <version>4.2.1</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>
          <artifactId>transport</artifactId>
          <groupId>org.elasticsearch.client</groupId>
        </exclusion>
      </exclusions>
    </dependency>

我将添加 org.elasticsearch.client.transport 并试一试。

【问题讨论】:

  • Spring Data Elasticsearch 在它的 pom.xml 中明确依赖 org.elasticsearch.client:transport。为什么 Spring Boot 的制造商排除了这一点 - 我不知道。
  • @PJMeisch - 我在一个非 Spring Boot 项目中尝试了 spring-data-elasticsearch,我得到 java.lang.NoClassDefFoundError: org/springframework/core/NativeDetector 但是当我排除 org.elasticsearch 时。 client:transport 来自 spring-data-elasticsearch 并将其添加为单独的依赖项我没有收到错误。所以这可能是原因。

标签: spring-boot elasticsearch spring-data-elasticsearch elasticsearch-percolate


【解决方案1】:

用我的成功回答我自己的问题。可能会帮助某人。

添加以下依赖后

<dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>7.12.1</version>
        </dependency>

通过下面的代码,我能够在 Percolator 上运行查询。 我不知道为什么 spring-boot 删除了上述依赖项。到目前为止,我没有遇到任何问题。如果我因为上述依赖而遇到问题,我会在这里更新。

public Query buildLookUpQuery(String text){
        XContentBuilder docBuilder = null;
        try {
            docBuilder = XContentFactory.jsonBuilder().startObject();
            docBuilder.field("message", text);
            docBuilder.endObject();
        } catch (IOException ioException) {
            log.error("Unable to build a query ", ioException.getMessage());
        }
        PercolateQueryBuilder percolateQuery = new PercolateQueryBuilder(QUERY,
                BytesReference.bytes(docBuilder),
                XContentType.JSON);
        return new NativeSearchQueryBuilder()
                .withQuery(percolateQuery)
                .build();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多