【问题标题】:Elasticsearch - Terms Aggregation nested fieldElasticsearch - 术语聚合嵌套字段
【发布时间】:2020-05-11 22:43:38
【问题描述】:

我有以下问题。我有一个带有 2 个属性(fieldB 和 fieldC)的嵌套字段(“列表”)。 文档如下所示:

"fieldA: "1",
"list": [
  {"fieldB": "ABC",
  "fieldC": "DEF"},
  {"fieldB": "ABC",
  "fieldC": "GHI"},
  {"fieldB": "UVW",
  "fieldC": "XYZ"},...]
                        },

我想获得所有文档中“ABC”(fieldB) 的所有可能 fieldC 值的不同列表。到目前为止,我已经在 J​​ava(Java REST 客户端)中尝试过这个:

 SearchRequest searchRequest = new SearchRequest("abc*");
 QueryBuilder matchQueryBuilder = QueryBuilders.boolQuery()
             .must(QueryBuilders.nestedQuery("aList", 
             QueryBuilders.matchQuery("list.fieldB.keyword", "ABC"), ScoreMode.None));
 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
 sourceBuilder.query(matchQueryBuilder)
              .aggregation(AggregationBuilders.nested("listAgg","list")
              .subAggregation(AggregationBuilders.terms("fieldBAgg")
              .field("list.fieldB.keyword")));

    searchRequest.source(sourceBuilder);

    SearchResponse searchResponse = null;
    try {
        searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    } catch (IOException e) {
        e.printStackTrace();
    }

    Nested list = searchResponse.getAggregations().get("listAgg");
    Terms fieldBs = list.getAggregations().get("fieldBAgg");

通过该查询,我获得了 fieldB 中包含“ABC”的所有文档,并获得了 all fieldC 值。但我只想要 fieldB 为“ABC”的 fieldC 值。

所以在那个例子中我得到了 DEF、GHI 和 XYZ。但我只想要 DEF 和 GHI。有人知道如何解决这个问题吗?

【问题讨论】:

    标签: java elasticsearch


    【解决方案1】:

    查询部分中的nested 约束只会选择所有具有满足约束的嵌套字段的文档。您还需要在聚合部分添加相同的约束,否则您将聚合所有选定文档的所有嵌套字段,这就是您所看到的。改为这样:

    // 1. terms aggregation on the desired nested field
    nestedField = AggregationBuilders.terms("fieldBAgg").field("list.fieldC.keyword");
    
    // 2. filter aggregation on the desired nested field value
    onlyBQuery = QueryBuilders.termQuery("list.fieldB.keyword", "ABC");
    onlyBFilter = AggregationBuilders.filter("onlyFieldB", onlyBQuery).subAggregation(nestedField);
    
    // 3. parent nested aggregation
    nested = AggregationBuilders.nested("listAgg", "list").subAggregation(onlyBFilter);
    
    // 4. main query/aggregation
    sourceBuilder.query(matchQueryBuilder).aggregation(nested);
    

    【讨论】:

    • 抱歉,我的代码中有错字,我聚合的是 fieldB 而不是 fieldC。请再试一次
    • 太棒了,很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2014-05-12
    • 2023-04-03
    • 1970-01-01
    • 2018-10-18
    • 2017-09-13
    • 1970-01-01
    相关资源
    最近更新 更多