Elasticsearch基于最早文档的日期范围查询构建方法咨询
解决方案:基于索引最早日期构造范围查询
你没法直接把获取最早文档的查询嵌入到range的gte参数里——Elasticsearch的查询DSL是静态声明式的,不支持在查询参数中动态引用另一个查询的结果。不过可以通过两步查询实现需求,而且比你原来的方法更高效:
步骤1:获取索引中的最早日期
用min聚合直接计算CustomElasticSearchDateTime字段的最小值,比排序取第一条文档效率高得多(尤其索引数据量大时):
{ "size": 0, "aggs": { "earliest_date": { "min": { "field": "CustomElasticSearchDateTime" } } } }
执行后,从返回结果的aggregations.earliest_date中拿到最早日期(可以用value_as_string直接获取格式化后的日期字符串,或者用value转成日期对象)。
步骤2:构造带动态日期范围的查询
用第一步拿到的最早日期,计算出「最早日期+6个月」的日期(比如用你所用编程语言的日期处理工具:Python的datetime、Java的LocalDateTime等),然后填入range查询:
{ "query": { "bool": { "filter": [ { "range": { "CustomElasticSearchDateTime": { "gte": "第一步获取的最早日期", "lte": "最早日期+6个月的日期", "relation": "WITHIN" } } } ] } } }
为什么不能一步实现?
Elasticsearch的查询和聚合在同一个请求中是并行执行的,查询阶段无法引用同请求的聚合结果;同时DSL不支持在参数中嵌套子查询动态取值,所以必须分两次请求完成。
内容的提问来源于stack exchange,提问作者Sam J Sem
相关产品推荐
相关产品推荐

