Elasticsearch 6.2父子关系下NamedEntity聚合统计问题
解决Elasticsearch父子文档的聚合需求
嗨,看来你已经搞定了mention字段的次数统计,接下来要拿到每个命名实体对应的父文档数量其实很简单——咱们只需要在现有的terms聚合下面嵌套一个reverse_nested聚合,再配合cardinality聚合来统计唯一的父文档即可。
针对你的场景,这里有一份适配Elasticsearch 6.2的完整查询DSL:
GET /your_index_name/_search { "size": 0, // 不返回具体文档,只保留聚合结果 "query": { "bool": { "filter": [ { "term": { "join_field": "NamedEntity" } } // 只针对子文档NamedEntity做聚合 ] } }, "aggs": { "mention_stats": { "terms": { "field": "mention.keyword", // 注意用keyword类型字段做terms聚合 "size": 100 // 按需调整返回的聚合桶数量 }, "aggs": { "parent_doc_count": { "reverse_nested": {}, // 跳转到父文档Document的上下文 "aggs": { "unique_parents": { "cardinality": { "field": "_id" // 统计父文档的唯一ID数量 } } } } } } } }
关键部分解释:
- 外层terms聚合:
mention_stats会按mention字段的不同值分组,每个桶里的doc_count就是你之前得到的该实体的出现次数。 - reverse_nested聚合:这个聚合的作用是从子文档NamedEntity“跳回”到它关联的父文档Document,让我们能基于父文档的属性做统计。
- cardinality聚合:
unique_parents会统计父文档ID的唯一值数量,也就是每个命名实体对应的父文档总数。
返回结果示例:
你会在聚合结果里看到类似这样的结构:
{ "aggregations": { "mention_stats": { "buckets": [ { "key": "Elasticsearch", "doc_count": 3, // mention出现的总次数 "parent_doc_count": { "unique_parents": { "value": 2 // 包含该实体的父文档数量 } } } ] } } }
另外,如果你的子文档里已经存储了parent_id字段(就是父文档的ID),也可以简化一下,不用reverse_nested,直接在terms聚合下面嵌套一个cardinality聚合统计parent_id.keyword的唯一值,这样性能可能更好:
"aggs": { "mention_stats": { "terms": { "field": "mention.keyword" }, "aggs": { "unique_parent_count": { "cardinality": { "field": "parent_id.keyword" } } } } }
这个方式更直接,因为子文档本身就持有父ID,不需要跳转上下文,结果和之前的方案是一致的。
内容的提问来源于stack exchange,提问作者Bruno Thomas
相关产品推荐
相关产品推荐

