如何基于字段最大值实现索引数据过滤?
数值类型date字段取最大值过滤方案
因为date字段是纯数值类型,不需要做额外的日期格式解析,直接分两步实现即可:
- 第一步:通过最大值聚合拿到
date字段的当前最大值 - 第二步:用拿到的最大值做精确匹配过滤,只返回符合条件的文档
第一步:查询date字段最大值
直接发聚合查询,不需要返回普通文档,把size设为0减少性能损耗:
POST 目标索引名/_search { "size": 0, "aggs": { "max_date": { "max": { "field": "date" } } } }
查询返回结果里,aggregations.max_date.value就是当前索引里date字段的最大值,记录这个数值备用。
第二步:过滤出date等于最大值的全部数据
把上一步拿到的数值填入查询条件,做精确匹配查询:
POST 目标索引名/_search { "query": { "term": { "date": { "value": 上一步查到的实际最大值 } } } }
如果需要后续查询默认只返回这部分数据,不用每次都重复写查询条件,可以给索引绑定一个带过滤规则的别名:
POST _aliases { "actions": [ { "add": { "index": "目标索引名", "alias": "max_date_filtered_data", "filter": { "term": { "date": 上一步查到的实际最大值 } } } } ] }
后续直接查max_date_filtered_data这个别名,就只会返回date等于最大值的文档。
注意:如果索引存在持续写入的场景,date字段的最大值会随新数据更新,固定值的过滤别名不会自动同步新的最大值,需要搭配定时任务定期重查最大值、更新别名过滤规则。
内容的提问来源于stack exchange,提问作者Arifullah
相关产品推荐
相关产品推荐

