Elasticsearch如何实现子聚合查询获取2021年文章高频词?
Elasticsearch 聚合报错排查及解决方案
核心报错原因
- 聚合语法结构错误:你在顶层
aggs配置下直接新增了aggs字段,ES会将这个aggs识别为自定义的聚合名称,其下的word_counts_2021就会被误判为聚合类型,因此抛出「未知聚合类型」的错误。管道类聚合(如bucket_selector)必须作为某一个父聚合的子聚合存在,不能直接挂载在顶层aggs下。 - 业务逻辑设计低效:当前写法先聚合全量文档再过滤2021年数据,完全可以前置到query阶段过滤,大幅降低聚合计算量。
- 字段聚合逻辑错误:
publish_datetime是日期类型,用terms聚合不符合日期分层统计的需求;content如果是text类型,默认没有开启fielddata,无法直接做terms聚合,强行执行会触发新的报错。
最优实现方案
直接在query阶段过滤2021年的文档,再对文本做高频词统计即可,推荐两种适配不同场景的写法:
写法1:terms聚合(需提前配置content字段的fielddata)
GET articles/_search { "size": 0, "query": { "range": { "publish_datetime": { "gte": "2021-01-01T00:00:00Z", "lte": "2021-12-31T23:59:59Z" } } }, "aggs": { "top_2021_words": { "terms": { "field": "content", "size": 100 } } } }
写法2:significant_text聚合(无需修改mapping,专门适配文本关键词统计)
GET articles/_search { "size": 0, "query": { "range": { "publish_datetime": { "gte": "2021-01-01", "lte": "2021-12-31" } } }, "aggs": { "top_2021_keywords": { "significant_text": { "field": "content", "size": 100 } } } }
内容的提问来源于stack exchange,提问作者dom
相关产品推荐
相关产品推荐

