You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:23:21