ElasticSearch如何基于嵌套字段求和返回指定地区播放量Top视频
需求实现结论
这个需求完全可以通过Elasticsearch实现,不需要调整现有mapping的核心结构,依托嵌套字段的聚合能力即可完成统计。
实现核心逻辑
你的viewed_videos字段已经设置为nested类型,刚好满足嵌套文档独立统计的需求,整体实现步骤如下:
- 第一步:在查询条件中筛选指定地区的viewer文档,缩小统计范围
- 第二步:通过
nested聚合进入viewed_videos嵌套文档的查询上下文 - 第三步:按视频id做分组聚合,对每个分组内的
times_viewed值做求和,再按求和结果倒序排列,取前X条即可得到目标排名
注意事项
你当前mapping中viewed_videos.id为text类型,默认不支持精确分组聚合,建议做如下优化:
给viewed_videos.id增加keyword类型的子字段,或者直接将其类型改为keyword(如果视频id为无特殊字符的唯一标识),避免分词导致的分组统计错误。如果location字段也是text类型,也需要同步增加keyword子字段用于地区筛选。
示例查询DSL
以下为查询「北京地区播放量Top10视频」的示例DSL,可根据你的实际需求调整参数:
POST /viewer/_search { "size": 0, "query": { "bool": { "filter": [ {"term": {"location.keyword": "北京"}} ] } }, "aggs": { "enter_nested_videos": { "nested": { "path": "viewed_videos" }, "aggs": { "group_by_video_id": { "terms": { "field": "viewed_videos.id.keyword", "size": 10, "order": {"sum_play_count": "desc"} }, "aggs": { "sum_play_count": { "sum": {"field": "viewed_videos.times_viewed"} } } } } } } }
内容的提问来源于stack exchange,提问作者wonderv
相关产品推荐
相关产品推荐

