ElasticSearch Java API从查询构建器获取不同的值 [英] ElasticSearch Java API to get distinct values from the Query Builders

查看:269
本文介绍了ElasticSearch Java API从查询构建器获取不同的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Am querying ElasticSearch using Java API and am getting lot of duplicate values. I want to get only the unique values from the query (distinct value). How can we get the distinct values from the Query Builder.

请在下面找到我的Java代码,该代码给出重复的值。

Please find my java code below, which is giving duplicate values.

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));

Am使用弹性搜索6.2.3版本和RestHighLevelClient

Am using elastic search 6.2.3 version with RestHighLevelClient

推荐答案

方法1:您需要使用所谓的汇总API:

Way 1: You need to use the so-called aggregation API :

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

Sample query to get distinct emails client :

{
  "query" : {
    "match_all" : { }
  },
  "aggregations" : {
    "label_agg" : {
      "terms" : {
        "field" : "Email_client",
        "size" : 100
      }
    }
  }
}

Java代码sample =>

Java code sample=>

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());

方法2:
使用聚合基数Api:
弹性查询示例:

Way 2 : Use cardinality of aggregation Api: Sample elasticquery:

{
  "size": 0,
  "aggs": {
    "distinct": {
      "cardinality": {
        "field": "Email_client",
        "size" : 100
      }
    }
  }

Java代码示例=>

Java code sample=>

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();

这篇关于ElasticSearch Java API从查询构建器获取不同的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆