Range query
source:www.elastic.co/guide/en/el…
path:Elasticsearch - Query DSL - Term-level queries - Range query
搜索在所指定范围内的document
Example
下面的query会返回age field在10到20之间的document。
GET /_search
{
"query": {
"range": {
"age": {
"gte": 10,
"lte": 20,
"boost": 2.0
}
}
}
}
Top-level parameters for range
field
(Required,object) 要搜索的field
Parameters for field
gt
(Optional) 大于
gte
(Optional)大于等于
lt
(Optional)小于
lte
(Optional)小于等于
format
(Optional,string)用于转换query中date value的 Date 格式。
默认地,Elasticsearch使用field在mapping中定义的date format。而该配置将会覆盖mapping中所定义的format。format相关语法请查看 format
Warning:若format或date值是不完整的,range query会用默认值来替换缺失的部分,see Missing date components.
relation
(Optional,string)控制range query如何进行匹配,可选值为
INTERSECTS(Default):
查询field的值与query的range相交的document
CONTAINS
查询field的值完全包含query的range的document
WITHIN
查询field的值完全在query的range的document
time_zone
(Optional,string) Coordinated Universal Time (UTC) offset or IANA time zone 用来将query中的date值转为UTC。有效的值为 ISO 8601 UTC偏移量,如+01:00或-08:00,以及IANA 时区IDs,如America/Los_Angeles。
在这 Time zone in range queries有使用time_zone参数的例子。
Note:time_zone 参数并不影响now的值,now是在UTC的系统时间。然而,当now参与计算以及date math rounding时,time_zone确实会转换date。例如,time_zone参数会转换now/d。
boost
(Optional,float)用于增加或减少一个query得分的浮点数,默认为1.0。你可以使用boost参数来调整有多个query的查询的得分。Boost的值是相对于默认的1.0来说的。一个大于1.0的值会增加score。
Note
Using the range query with text and keyword fields
如果search.allow_expensive_queries被设置为false,在text或keyword上的range query不会被执行。
Using therange query with date fields
当field 是date类型时,你可以使用date math 与下列参数一起使用
gtgteltlte
例如,下面的query会搜索timestamp field的date在 昨天到今天之间的document
GET /_search
{
"query": {
"range": {
"timestamp": {
"gte": "now-1d/d",
"lte": "now/d"
}
}
}
}
Missing date components
对于range query和date range聚合操作,Elasticsearch会使用下面的值来替换缺失的date部分。但如果年部分缺失 不会进行替代。
MONTH_OF_YEAR: 01
DAY_OF_MONTH: 01
HOUR_OF_DAY: 23
MINUTE_OF_HOUR: 59
SECOND_OF_MINUTE: 59
NANO_OF_SECOND: 999_999_999
例如,如果format是yyyy-MM,Elasticsearch会将2099-12转为2099-12-01T23:59:59.999_999_999Z。这个date使用所提供的的年(2099)和月(12)但是使用默认的天(01),小时(23),分钟(59),秒(59)和纳秒(999_999_999)。
Numeric date range value
当没指定date format并且range query是作用在date 类型field上时,数字类型的值会解释为从纪元开始的毫秒值。如果你想要该值代表年,比如,2020,你需要将它作为一个字符串(例如,"2020")传入,这种字符串会根据默认格式或设置的格式进行解析。
Date math and rounding
Elasticsearch 会对参数中的date math 按照下面规则进行合入:
gt
向上舍入到未被date覆盖的第一个毫秒,例如, 2014-11-18||/M 会舍入为2014-12-01T00:00:00.000,排除了11月
gte
向下舍入到第一个毫秒
例如,2014-11-18||/M会向下舍入为2014-11-01T00:00:00.000,包含11月
lt
向下舍入为date值的最后一毫秒,例如,2014-11-18||/M向下舍入为2014-10-31T23:59:59.999。
lte
向上舍入为date的最后一毫秒,例如,2014-11-18||/M会上舍入为2014-11-30T23:59:59.999,包含11月
Example query using time_zone parameter
你可以使用time_zone参数来自江date值转为UTC,通过使用UTC偏移量的方式,例如
GET /_search
{
"query": {
"range": {
"timestamp": {
"time_zone": "+01:00", ①
"gte": "2020-01-01T00:00:00", ②
"lte": "now" ③
}
}
}
}
①代表date值使用+01:00的UTC偏移量
②因为使用了+01:00的偏移量,Elasticsearch将date转为2019-12-31T23:00:00 UTC
③time_zone参数不会影响到now值