【问题标题】:Writing queries in Elasticsearch's Java client在 Elasticsearch 的 Java 客户端中编写查询
【发布时间】:2017-12-13 06:10:15
【问题描述】:

我使用了 Elastic Search java 客户端, 我正在实现一个搜索应用程序。 (索引已经建好了)

我想重现Elastic Search java客户端,如下查询。

但是无法复制。

如果你熟悉java客户端, 我想让你告诉我。

我要执行的查询(示例字段有java和php)

{
    "Query": {
        "Bool": {
            "Must": [{
                "Match": {
                    "Sample": "java"
                }},
                {"Match": {
                    "Sample": "php"
                }
            }]
        }
    },
    "Size": 50
}

在 java 客户端上组装查询

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery ().
        Must (QueryBuilders.matchQuery ("sample", "test")));
SearchRequestBuilder builder = client.prepareSearch ()
        .setSize (50)
        .setQuery (boolQuery);
System.out.println (builder);

↑“builder”变量的输出内容

{
  "Size": 50,
  "Query": {
    "Bool": {
      "Must": [
        {
          "Match": {
            "Sample": {
              "Query": "test",
              "Operator": "OR",
              "Prefix_length": 0,
              "Max_expansions": 50,
              "Fuzzy_transpositions": true,
              "Lenient": false,
              "Zero_terms_query": "NONE",
              "Boost": 1.0
            }
          }
        }
      ],
      "Disable_coord": false,
      "Adjust_pure_negative": true,
      "Boost": 1.0
    }
  },
  "Ext": {}
}

输出时,匹配中包含额外的属性。 而且,我仍然不知道如何匹配多个单词。

有人,请把你的智慧借给我。

环境

  • 语言:Java 8
  • 框架:Spring
  • Elasticsearch 客户端(jar)版本
    * org.elasticsearch:5.1.1
    * org.elasticsearch.client:5.1.1
  • Elasticsearch 的版本:5.3.1

【问题讨论】:

    标签: java elasticsearch


    【解决方案1】:

    假设我有以下映射:

    {
        "articles": {
            "mappings": {
                "article": {
                    "properties": {
                        "sample": {
                            "type": "text"
                        }
                    }
                }
            }
        }
    }
    

    我索引了以下三个文档:

    { "sample" : "java php" },
    { "sample" : "java" },
    { "sample" : "php" }
    

    您提供的 es-query 给了我以下结果:

    {
        "took": 1,
        "timed_out": false,
        "_shards": {
            "total": 5,
            "successful": 5,
            "failed": 0
        },
        "hits": {
            "total": 1,
            "max_score": 0.51623213,
            "hits": [
                {
                    "_index": "articles",
                    "_type": "article",
                    "_id": "AV0rSbyjpRVEWsG0iTxj",
                    "_score": 0.51623213,
                    "_source": {
                        "sample": "java php"
                    }
                }
            ]
        }
    }
    

    为了使用 Java API 获得相同的结果,我使用:

    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
            .must(QueryBuilders.matchQuery ("sample", "java"))
            .must(QueryBuilders.matchQuery ("sample", "php"));
    SearchRequestBuilder builder = client.prepareSearch()
            .setSize(50)
            .setQuery(boolQuery);
    
    SearchResponse response;
    try {
        response = builder.execute().get();
    
        for (SearchHit hit : response.getHits().getHits()) {
            LOG.info("Result: " + hit.getSourceAsString());
        }
    } catch (InterruptedException | ExecutionException e) {
        // handle exception
        LOG.error("Exception while executing query {}", e);
    }
    

    结果:

    Result: { "sample" : "java php" }
    

    您在调试时在查询中看到的所有附加属性只是默认值,Java API 会明确设置它们。

    【讨论】:

    • 谢谢!我很感激。我能够成功实施。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2011-12-12
    • 2016-05-20
    • 2021-03-08
    • 1970-01-01
    • 2017-07-05
    • 2021-01-03
    相关资源
    最近更新 更多