Elasticsearch分组取最新文档过滤:bucket_path配置问题咨询
Elasticsearch按分组筛选最新且符合字段条件的文档解决方法
问题分析
你需要按ident和version分组,获取每组中chdate最新且field1等于指定值的文档,但原查询中bucket_selector的buckets_path配置错误,因为bucket_selector只能引用聚合生成的数值型指标结果,无法直接访问top_hits返回的文档_source字段,这是导致报错的核心原因。
正确解决方案
下面提供两种可行的查询方案,都能实现你的需求:
方案一:先获取最新时间再筛选匹配文档
先通过max聚合拿到每组的最新chdate,再筛选出该组中chdate等于最新值且field1符合条件的文档,最后保留有匹配结果的bucket:
{ "size": 0, "aggs": { "ident_groups": { "terms": { "field": "ident" }, "aggs": { "version_groups": { "terms": { "field": "version" }, "aggs": { // 获取当前version分组的最新chdate "latest_chdate": { "max": { "field": "chdate" } }, // 筛选当前组中chdate等于最新值且field1为指定值的文档 "latest_matching_docs": { "filter": { "bool": { "must": [ { "term": { "field1": 0 } }, // 替换为你的指定x值 { "term": { "chdate": "{{latest_chdate}}" } } ] } }, "aggs": { "matched_doc": { "top_hits": { "size": 1, "_source": ["objid", "ident", "version", "chdate", "field1"] } } } }, // 仅保留存在匹配文档的bucket "filter_valid_buckets": { "bucket_selector": { "buckets_path": { "match_count": "latest_matching_docs.doc_count" }, "script": "params.match_count > 0" } } } } } } } }
方案二:先取最新文档再判断字段值
先通过top_hits拿到每组最新的文档,再用script_metric聚合提取该文档的field1值,最后用bucket_selector筛选符合条件的bucket:
{ "size": 0, "aggs": { "ident": { "terms": { "field": "ident" }, "aggs": { "version": { "terms": { "field": "version" }, "aggs": { // 获取当前分组中chdate最新的文档 "latest_doc": { "top_hits": { "size": 1, "sort": [{"chdate": "desc"}], "_source": ["objid", "field1"] } }, // 提取最新文档的field1值作为聚合指标 "field1_value": { "script_metric": { "init_script": "state.val = null", "map_script": "state.val = params._agg.latest_doc.hits.hits[0]._source.field1", "combine_script": "return state.val", "reduce_script": "return states[0]" } }, // 根据field1值筛选bucket "keep_matching": { "bucket_selector": { "buckets_path": { "field1": "field1_value" }, "script": "params.field1 == 0" // 替换为你的指定x值 } } } } } } } }
使用说明
- 当需要
x=1时,只需将两个方案中的script部分params.field1 == 0改为params.field1 == 1即可。 - 方案一在数据量大时效率更高,因为提前筛选了符合条件的文档;方案二更直观,先拿到最新文档再判断字段值。
内容的提问来源于stack exchange,提问作者M. A. Tanaka
相关产品推荐
相关产品推荐

