Term-level queries.Range query

112 阅读4分钟

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参数的例子。

Notetime_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 与下列参数一起使用

  • gt
  • gte
  • lt
  • lte

例如,下面的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