ElasticSearch能否统计仅存在于文档集B的嵌套聚合词条?
新版ElasticSearch实现仅存在于指定文档集的嵌套词条聚合方案
完全可以实现你描述的需求,以下是具体的实现方案:
前提条件
确保你的嵌套字段已正确配置nested类型映射,示例映射如下:
{ "mappings": { "properties": { "document_set": { "type": "keyword" }, "fruits": { "type": "nested", "properties": { "fruit": { "type": "keyword" } } } } } }
聚合查询DSL
通过嵌套聚合结合桶筛选脚本,直接获取仅存在于document_set: "b"、不存在于document_set: "a"的fruit词条:
{ "size": 0, "aggs": { "nested_fruits_context": { "nested": { "path": "fruits" }, "aggs": { "all_fruit_terms": { "terms": { "field": "fruits.fruit", "size": 10000 // 根据实际数据量调整大小 }, "aggs": { "document_set_distribution": { "terms": { "field": "document_set", "size": 2 // 仅需统计a和b两个集合 } }, "filter_only_in_b": { "bucket_selector": { "buckets_path": { "count_a": "document_set_distribution>_bucket_count['a']", "count_b": "document_set_distribution>_bucket_count['b']" }, "script": "params.count_b > 0 && (params.count_a == null || params.count_a == 0)" } } } } } } } }
逻辑说明
nested_fruits_context:进入嵌套字段fruits的聚合上下文,确保能正确遍历嵌套数组中的每个元素all_fruit_terms:对所有fruit词条进行分组聚合document_set_distribution:针对每个fruit词条,统计其在document_set中的分布情况filter_only_in_b:通过脚本筛选出满足以下条件的词条:- 在
document_set: "b"中有匹配的文档(count_b > 0) - 在
document_set: "a"中没有匹配的文档(count_a为空或等于0)
- 在
内容的提问来源于stack exchange,提问作者void
相关产品推荐
相关产品推荐

