java - 在Elasticsearch的Java客户端中编写查询

标签 java elasticsearch

我使用了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)版本
    *组织 flex 搜索:5.1.1
    * Org.elasticsearch.client:5.1.1
  • Elasticsearch的版本:5.3.1
  • 最佳答案

    假设我有以下映射:

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

    我索引了以下三个文档:
    { "sample" : "java php" },
    { "sample" : "java" },
    { "sample" : "php" }
    

    您提供的es查询给我以下结果:
    {
        "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会对其进行显式设置。

    关于java - 在Elasticsearch的Java客户端中编写查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44996276/

    相关文章:

    java - 如何在 spring data elasticsearch 中添加 run-as header

    Java Servlet 错误 'Resource Not Available'

    Elasticsearch:如果查询包含索引数组中至少一项中的所有单词,如何仅返回文本搜索查询的结果?

    datetime - 日期之间的 Elasticsearch 计数

    java - 如果小数存在,则获取下一个最大数值

    ElasticSearch 类似集合(唯一值列表)的功能?

    java - 搜索 API Elasticsearch 索引

    java - 合并多个流并写入排序的输出流

    java - Java中的序列化需要什么?

    java - 在gradle.properties中指定相对路径