Java API ElasticSearch для получения различных значений от построителей запросов - PullRequest
0 голосов
/ 02 июля 2018

Я запрашиваю ElasticSearch, используя Java API, и получаю много повторяющихся значений. Я хочу получить только уникальные значения из запроса (отличное значение). Как мы можем получить отличные значения от Query Builder.

Пожалуйста, найдите мой код 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));

Использую эластичный поиск версии 6.2.3 с RestHighLevelClient

1 Ответ

0 голосов
/ 22 января 2019

Способ 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());

Способ 2: Используйте кардинальность агрегации Api: Пример эластичного запроса:

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

Пример кода Java =>

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