ElasticSearch range查询中from与gte/gt是否等价?能否长期使用?
Elasticsearch Range查询:
from/to/include_lower/include_upper与gte/lte是否等价? 问题背景
我在使用olivere/elastic包操作Elasticsearch时发现,它生成的range查询使用了from、to、include_lower、include_upper这些参数,示例如下:
"query": { "range": { "myfield": { "from": 0.6666, "include_lower": true, "include_upper": true, "to": null } } }
而Elasticsearch官方文档推荐的语法是:
"query": { "range": { "myfield": { "gte": 0.6666 } } }
实际测试发现两者效果一致,想知道:
- 这两种语法是否完全等价?
- 前者(未在当前文档中记录的语法)能否长期使用?
- Elasticsearch是否有相关说明?
解答
1. 两种语法确实完全等价
其实from/to/include_lower/include_upper是Elasticsearch早期版本里的range查询语法,后来官方为了让查询语句更直观好读,才推出了gt/gte/lt/lte这些缩写参数——二者在功能上是100%等价的:
- 当
include_lower设为true时,from就对应gte;如果是false,则对应gt - 同理,
include_upper为true时,to对应lte;false则对应lt
你给出的示例里,from: 0.6666+include_lower: true+to: null,完全等同于gte: 0.6666,所以执行效果自然没差别。
2. 不建议长期依赖旧语法
虽然现在新版本的Elasticsearch还兼容这套旧语法,但官方早就不推荐用了,而且未来大概率会被移除。Elasticsearch对旧特性的处理一般是先给弃用警告,过几个版本就直接砍掉。所以如果是新项目,直接用gt/gte/lt/lte就好;如果是老项目在用旧语法,最好慢慢迁移过来,免得以后版本升级踩坑。
3. 官方的相关说明
这套旧语法在Elasticsearch的旧版官方文档里能找到详细说明,但当前的最新文档已经把它们标记为过时语法,并且明确引导用户使用新的缩写参数。另外,在部分版本的release notes里,官方也提到了对旧range语法的兼容是为了向后兼容,不建议继续使用。
内容的提问来源于stack exchange,提问作者Patryk
相关产品推荐
相关产品推荐

