Elasticsearch等价SQL:带日期过滤获取stocks索引首尾文档close值
Elasticsearch stocks索引双close值查询实现
需求中的两个取值逻辑可以通过单条聚合查询一次性实现,和给出的SQL逻辑完全等价,不需要拆分多次请求。
查询DSL
直接执行以下请求即可:
GET /stocks/_search { "size": 0, "aggs": { "last_close": { "filter": { "range": { "date": { "gte": "2022-06-01" } } }, "aggs": { "target_doc": { "top_hits": { "size": 1, "sort": [ { "date": "desc" } ], "_source": ["close"] } } } }, "earliest_close": { "top_hits": { "size": 1, "sort": [ { "date": "asc" } ], "_source": ["close"] } } } }
结果提取
返回结果中两个目标值的提取路径:
- 指定2022-06-01之后最新文档的close值:
aggregations.last_close.target_doc.hits.hits[0]._source.close - 全量数据按日期正序第一条的close值:
aggregations.earliest_close.hits.hits[0]._source.close
优化说明
- 该查询设置
size:0,不会返回无关的原始文档列表,只返回聚合计算结果,性能远高于两次单独查询 _source配置仅返回需要的close字段,减少不必要的网络传输开销- 日期条件直接写
2022-06-01即可,Elasticsearch会根据索引中date字段的格式自动匹配为2022-06-01 00:00:00,不需要手动补全时间部分
内容的提问来源于stack exchange,提问作者Elunemoon
相关产品推荐
相关产品推荐

