elasticsearch,elastic-stack,Java,elasticsearch,Elastic Stack" /> elasticsearch,elastic-stack,Java,elasticsearch,Elastic Stack" />

ElasticSearch Java API从查询生成器中获取不同的值

ElasticSearch Java API从查询生成器中获取不同的值,java,elasticsearch,elastic-stack,Java,elasticsearch,Elastic Stack,我正在使用Java API查询ElasticSearch,并获得了大量重复值。我只想从查询中获取唯一的值(不同的值)。如何从查询生成器中获取不同的值 请在下面找到我的java代码,它给出了重复的值 QueryBuilder qb2=null; List<Integer> link_id_array=new ArrayList<Integer>(); for(Replacement link_id:linkIDList) { link_id_array.add(li

我正在使用Java API查询ElasticSearch,并获得了大量重复值。我只想从查询中获取唯一的值(不同的值)。如何从查询生成器中获取不同的值

请在下面找到我的java代码,它给出了重复的值

QueryBuilder qb2=null;
List<Integer> link_id_array=new ArrayList<Integer>();
for(Replacement link_id:linkIDList) {
    link_id_array.add(link_id.getLink_id());
}

qb2 = QueryBuilders.boolQuery()
        .must(QueryBuilders.termsQuery("id", link_id_array));
QueryBuilder qb2=null;
List link_id_array=new ArrayList();
用于(替换链接\u id:LinkId列表){
link_id_array.add(link_id.getLink_id());
}
qb2=QueryBuilders.boolQuery()
.must(QueryBuilders.termsQuery(“id”,link_id_数组));

我使用弹性搜索6.2.3版本和RestHighLevelClient方法1:您需要使用所谓的聚合API:

获取不同电子邮件客户端的示例查询:

{
  "query" : {
    "match_all" : { }
  },
  "aggregations" : {
    "label_agg" : {
      "terms" : {
        "field" : "Email_client",
        "size" : 100
      }
    }
  }
}
Java代码示例=>

SearchRequestBuilder aggregationQuery = 
      client.prepareSearch("emails")
        .setQuery(QueryBuilders.matchAllQuery())
        .addAggregation(AggregationBuilders.terms("label_agg")
          .field("Email_client").size(100));

SearchResponse response = aggregationQuery.execute().get();
    Aggregation aggregation = response.getAggregations().get("label_agg");
    StringTerms st = (StringTerms) aggregation;
    return st.getBuckets().stream()
      .map(bucket -> bucket.getKeyAsString())
      .collect(toList());
AggregationBuilder agg11 = AggregationBuilders.cardinality("distinct").field("Email_client");
        SearchResponse response11 = client.prepareSearch("emails")// we can give multiple index names here
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(query11)
                .addAggregation(agg11)
                .setExplain(true)
                .setSize(0)
                .get();
方式2: 使用聚合Api的基数: elasticquery示例:

{
  "size": 0,
  "aggs": {
    "distinct": {
      "cardinality": {
        "field": "Email_client",
        "size" : 100
      }
    }
  }
Java代码示例=>

SearchRequestBuilder aggregationQuery = 
      client.prepareSearch("emails")
        .setQuery(QueryBuilders.matchAllQuery())
        .addAggregation(AggregationBuilders.terms("label_agg")
          .field("Email_client").size(100));

SearchResponse response = aggregationQuery.execute().get();
    Aggregation aggregation = response.getAggregations().get("label_agg");
    StringTerms st = (StringTerms) aggregation;
    return st.getBuckets().stream()
      .map(bucket -> bucket.getKeyAsString())
      .collect(toList());
AggregationBuilder agg11 = AggregationBuilders.cardinality("distinct").field("Email_client");
        SearchResponse response11 = client.prepareSearch("emails")// we can give multiple index names here
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(query11)
                .addAggregation(agg11)
                .setExplain(true)
                .setSize(0)
                .get();

Way1出现异常“无效术语聚合器顺序路径[\u key]。未知聚合[\u key]”}],“类型”:“搜索阶段执行\u异常”@rogger2016{“类型”:“聚合执行\u异常”,“原因”:“无效术语聚合器顺序路径[\u key]。未知聚合[\u key]”}面临相同错误。您找到了解决方案吗?第二种方法给出了重复的值。这两种解决方案对我都不起作用