【问题标题】:ElasticSearch Java API to get distinct values from the Query BuildersElasticSearch Java API 从查询构建器中获取不同的值
【发布时间】:2018-07-02 14:29:57
【问题描述】:

我正在使用 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));

我正在使用带有 RestHighLevelClient 的弹性搜索 6.2.3 版本

【问题讨论】:

    标签: java elasticsearch elastic-stack


    【解决方案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();
    

    【讨论】:

    • Way1 出现异常“无效的术语聚合器订单路径 [_key]。未知聚合 [_key]”}],"type":"search_phase_execution_exception"
    • @rogger2016 {"type":"aggregation_execution_exception","re​​ason":"无效的 term-aggregator 订单路径 [_key]。未知的聚合 [_key]"} 面临同样的错误。有没有找到解决办法?
    • 第二种方法给出了重复值。这两种解决方案都不适合我
    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2023-01-24
    • 2021-06-04
    相关资源
    最近更新 更多