2

我在这里看到了你们为下面给出的链接提供解决方案的帖子。 ElasticSearch Java API 从查询构建器中获取不同的值

有什么方法可以使用 实现不同的电子邮件org.elasticsearch.client.RestHighLevelClient?你能帮我解决这个问题吗,我尝试了很多方法,但都无法解决。但我能够在 SQL Workbench 中实现相同的功能,下面使用 Kibana 翻译器给出了等效的 json 查询。

SELECT DISTINCT email_client.keyword
FROM email_reference;

下面给出了等效的 Elasticsearch 查询:

{
  "from": 0,
  "size": 0,
  "_source": {
    "includes": ["email_client.keyword"],
    "excludes": []
  },
  "stored_fields": "email_client.keyword",
  "aggregations": {
    "email_client.keyword": {
      "terms": {
        "field": "email_client.keyword",
        "size": 200,
        "min_doc_count": 1,
        "shard_min_doc_count": 0,
        "show_term_doc_count_error": false,
        "order": [
          {
            "_count": "desc"
          },
          {
            "_key": "asc"
          }
        ]
      }
    }
  }
}

所以现在我想使用 RestHighLevelClient 形成这个 JSON 查询,我已经尝试过,但问题是 RestHighLevelClient 中没有 prepareSearch() 是否有其他方法可以使用 RestHighLevelClient 来实现?

4

2 回答 2

0

这应该与 RestHighLevelClient 一起使用:

        MultiSearchRequest multiRequest = new MultiSearchRequest();
        SearchRequest searchRequest = new SearchRequest();
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.size(0); // return only aggregation results
        searchSourceBuilder.aggregation(AggregationBuilders.terms("label_agg").field("email_client.keyword").size(200));
        searchRequest.indices("email_reference"); // index name
        searchRequest.source(searchSourceBuilder);
        multiRequest.add(searchRequest);
        MultiSearchResponse response = restHighLevelClient.msearch(multiRequest, RequestOptions.DEFAULT);
于 2020-06-15T10:10:29.143 回答
0

对于版本 7.11.2 的 elasticsearch-rest-high-level-client,以下示例对我有用。您需要为带有关键字的字段设置聚合。

    private List<String> queryForDistinctMetadata(String aggregationKey, String field) throws IOException {

        var aggregationBuilder = AggregationBuilders
                .terms(aggregationKey)
                .field(field);

        var searchSourceBuilder = new SearchSourceBuilder()
                .aggregation(aggregationBuilder)
                .size(0);

        var searchRequest = new SearchRequest()
                .indices("<your index here>")
                .source(searchSourceBuilder);

        var response = client.search(searchRequest, RequestOptions.DEFAULT);

        var aggregation = (ParsedStringTerms) response.getAggregations().get(aggregationKey);

        return aggregation.getBuckets()
                .parallelStream()
                .map(Terms.Bucket::getKeyAsString)
                .collect(Collectors.toList());
    }
于 2021-04-26T15:27:17.630 回答