如何在Elasticsearch聚合结果中展示与activity.kw对应的activity.label文本
实现方案
方案1:使用top_hits子聚合(无需改动索引,开箱即用)
直接在现有terms聚合下新增top_hits子聚合,即可在每个桶内返回对应的activity.label值,修改后的查询语句如下:
GET /my-index/_search { "size": 0, "query": { "match_all": {} }, "aggs": { "group_by_state" : { "terms" : { "field" : "activity.kw", "size" : 3000 }, "aggs": { "get_label": { "top_hits": { "size": 1, "_source": ["activity.label"] } } } } } }
返回的聚合结果中,每个bucket下会多一个get_label字段,取hits.hits[0]._source.activity.label就是你需要的label值,做简单的结果处理就能得到你要的结构。
如果同一个activity.kw可能对应多个不同的activity.label,可以在top_hits中新增sort规则,取你需要的那条对应的label即可。
方案2:复合键预聚合(适合大数量场景,性能更高)
如果activity.kw和activity.label是严格一一对应的关系,可以在索引写入阶段预先把两个值拼接成一个keyword类型的复合字段,比如activity.kw_with_label,值格式类似0009||something。聚合时直接对该字段做terms聚合,返回的key拆分后即可同时拿到kw和label值,查询性能比方案1高很多,适合数据量级大、查询频率高的场景。
内容的提问来源于stack exchange,提问作者Bob Yoplait
相关产品推荐
相关产品推荐

