简体   繁体   English

Elasticsearch:使用Java本机API重写查询

[英]Elasticsearch: rewrite a query using java native api

I have this query in Elasticsearch that is working perfectly if I run it from the command line: 我在Elasticsearch中有此查询,如果我从命令行运行它,则该查询运行正常:

POST http://localhost:9200/YOUR_INDEX_NAME/_search/
{
  "size": 0,
  "aggs": {
    "autocomplete": {
      "terms": {
        "field": "autocomplete",
        "order": {
          "_count": "desc"
        },
        "include": {
          "pattern": "c.*"
        }
      }
    }
  },
  "query": {
    "prefix": {
      "autocomplete": {
        "value": "c"
      }
    }
  }
}

I have tried to rewrite it in java using the native client: 我试图使用本地客户端在Java中重写它:

SearchResponse searchResponse2 = newClient.prepareSearch(INDEX_NAME)
            .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
            .setQuery("{\n" +
                "  \"size\": 0,\n" +
                "  \"aggs\": {\n" +
                "    \"autocomplete\": {\n" +
                "      \"terms\": {\n" +
                "        \"field\": \"autocomplete\",\n" +
                "        \"order\": {\n" +
                "          \"_count\": \"desc\"\n" +
                "        },\n" +
                "        \"include\": {\n" +
                "          \"pattern\": \"c.*\"\n" +
                "        }\n" +
                "      }\n" +
                "    }\n" +
                "  },\n" +
                "  \"query\": {\n" +
                "    \"prefix\": {\n" +
                "      \"autocomplete\": {\n" +
                "        \"value\": \"c\"\n" +
                "      }\n" +
                "    }\n" +
                "  }\n" +
                "}").get();
        for (SearchHit res : searchResponse2.getHits()){
            System.out.println(res.getSourceAsString());

        }

Seems, that I'm missing something in this translation process. 似乎我在此翻译过程中遗漏了一些东西。 Thanks in advance 提前致谢

The Java client setQuery() method doesn't take a String with the JSON query, you need to build the query using the QueryBuilders helper methods and build the aggregation your the AggregationBuilders helper methods. Java客户端setQuery()方法并不需要一个String与JSON查询,则需要建立查询使用QueryBuilders辅助方法,并建立聚集你的AggregationBuilders辅助方法。

In your case that would go like this: 在您的情况下,将如下所示:

// build the aggregation
TermsBuilder agg = AggregationBuilders.terms("autocomplete")
        .field("autocomplete")
        .include("c.*")
        .order(Terms.Order.count(false));

// build the query
SearchResponse searchResponse2 = newClient.prepareSearch(INDEX_NAME)
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
        .setSize(0)
        .setQuery(QueryBuilders.prefixQuery("autocomplete", "c"))
        .addAggregation(agg)
        .get();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM