英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/_ranges.html
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
范围edit
本章到目前为止,对于数字,只介绍如何处理精确值查询。实际上,对数字范围进行过滤有时会更有用。例如,我们可能想要查找所有价格大于 $20 且小于 $40 美元的产品。
在 SQL 中,范围查询可以表示为:
SELECT document FROM products WHERE price BETWEEN 20 AND 40
Elasticsearch 有 range
查询,不出所料地,可以用它来查找处于某个范围内的文档:
"range" : { "price" : { "gte" : 20, "lte" : 40 } }
range
查询可同时提供包含(inclusive)和不包含(exclusive)这两种范围表达式,可供组合的选项如下:
-
gt
:>
大于(greater than) -
lt
:<
小于(less than) -
gte
:>=
大于或等于(greater than or equal to) -
lte
:<=
小于或等于(less than or equal to)
下面是一个范围查询的例子:.
GET /my_store/products/_search { "query" : { "constant_score" : { "filter" : { "range" : { "price" : { "gte" : 20, "lt" : 40 } } } } } }
如果想要范围无界(比方说 >20 ),只须省略其中一边的限制:
"range" : { "price" : { "gt" : 20 } }
日期范围edit
range
查询同样可以应用在日期字段上:
"range" : { "timestamp" : { "gt" : "2014-01-01 00:00:00", "lt" : "2014-01-07 00:00:00" } }
当使用它处理日期字段时, range
查询支持对 日期计算(date math) 进行操作,比方说,如果我们想查找时间戳在过去一小时内的所有文档:
"range" : { "timestamp" : { "gt" : "now-1h" } }
这个过滤器会一直查找时间戳在过去一个小时内的所有文档,让过滤器作为一个时间 滑动窗口(sliding window) 来过滤文档。
日期计算还可以被应用到某个具体的时间,并非只能是一个像 now 这样的占位符。只要在某个日期后加上一个双管符号 (||
) 并紧跟一个日期数学表达式就能做到:
日期计算是 日历相关(calendar aware) 的,所以它不仅知道每月的具体天数,还知道某年的总天数(闰年)等信息。更详细的内容可以参考: 时间格式参考文档 。
字符串范围edit
range
查询同样可以处理字符串字段,字符串范围可采用 字典顺序(lexicographically) 或字母顺序(alphabetically)。例如,下面这些字符串是采用字典序(lexicographically)排序的:
- 5, 50, 6, B, C, a, ab, abb, abc, b
在倒排索引中的词项就是采取字典顺序(lexicographically)排列的,这也是字符串范围可以使用这个顺序来确定的原因。
如果我们想查找从 a
到 b
(不包含)的字符串,同样可以使用 range
查询语法:
"range" : { "title" : { "gte" : "a", "lt" : "b" } }