如何在Elasticsearch中统计Tracardi索引interests键的出现次数?
问题描述
现有存储在Tracardi用户档案索引中的示例数据:
{ "doc1": { "interests": { "community-engagement": 55, "martech-developer": 7, "digital-marketing": 10 } }, "doc2": { "interests": { "community-engagement": 23, "martech-developer": 7, "content-marketing": 10 } } }
当前执行的Elasticsearch聚合查询:
{ "size": 0, "aggs": { "unique_names": { "terms": { "field": "interests", "size": 10 } } } }
返回结果统计的是interests字段中值的出现次数:
{ "55":1, "23":1, "7":2, "10":2 }
现在需要获取interests字段中各键的出现次数,期望结果如下:
{ "community-engagement":2, "martech-developer":2, "digital-marketing":1, "content-marketing":1 }
解决方案
要实现统计interests对象中所有键的出现次数,可通过脚本配合terms聚合提取每个文档中interests的所有键,再对这些键分组计数,具体有两种实现方式:
方式一:直接在聚合中使用脚本
{ "size": 0, "aggs": { "interest_keys_count": { "terms": { "script": { "source": "params._source.interests.keySet()" }, "size": 10 } } } }
- 脚本
params._source.interests.keySet()会提取当前文档中interests对象的所有键,返回键的数组 terms聚合会自动将数组中的每个元素单独作为分组依据,统计每个键在所有文档中的总出现次数
方式二:使用运行时字段(Elasticsearch 7.10+)
先定义一个提取键的运行时字段,再基于该字段聚合:
{ "size": 0, "runtime_mappings": { "interest_keys": { "type": "keyword", "script": { "source": "emit(params._source.interests.keySet())" } } }, "aggs": { "interest_keys_count": { "terms": { "field": "interest_keys", "size": 10 } } } }
两种写法都能得到你期望的统计结果。
内容的提问来源于stack exchange,提问作者mattcameron
相关产品推荐
相关产品推荐

