原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-range-query.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/query-dsl-range-query.html

范围查询 (range query)

返回包含指定范围内的词项的文档。

请求示例

下面这个搜索返回 age 字段包含 1020 之间的词项的文档。

GET /_search
{
    "query": {
        "range" : {
            "age" : {
                "gte" : 10,
                "lte" : 20,
                "boost" : 2.0
            }
        }
    }
}

range的顶级参数

<field>

(必需, object) 你想搜索的字段。

<field>的参数

gt
(可选) 大于
gte
(可选) 大于等于
lt
(可选) 小于
lte
(可选) 小于等于
format

(可选, string) 用于转换查询中 date 值的日期格式。

默认情况下,Elasticsearch 使用 <field> 的映射中指定的 date format。 它会覆盖该映射中设置的格式。

有效的语法请参考 format

如果 formatdate 值不完整,Elasticsearch 会用unix 时间的开始时间(即1970年1月1日)替换任何缺少的年、月或日期部分。

例如,如果 formatdd,则 Elasticsearch 会将 gte10 转换为1970-01-10T00:00:00.000Z, 即: 将"gte": "10" 转换为 "gte": "1970-01-10T00:00:00.000Z"

relation

(可选, string) 指示范围查询如何匹配 range 字段的值。有效值有:

INTERSECTS (默认)
匹配范围字段值与查询范围相交的文档。
CONTAINS
匹配范围字段值完全包含查询范围的文档。
WITHIN
匹配范围字段值完全在查询范围内的文档。
time_zone

(可选, string) 协调世界时(UTC)时差IANA时区,用于将查询字符串中的 date 值转换为 UTC。

有效值包括 ISO 8601 UTC 时差,如 +01:00-08:00,以及 IANA 时区识别名称,如 America/Los_Angeles

有关使用 time_zone 参数的查询示例,请参阅范围range查询中的时区

time_zone 参数影响 now日期计算值。 now 始终是 UTC 中的当前系统时间。 但是,time_zone 参数会对使用now日期计算舍入 计算的日期进行转换。 例如,time_zone 参数会将 now/d 的值进行转换。

boost

(可选, float) 用于降低或增加查询的相关性评分的浮点数。默认为 1.0

你可以使用 boost 参数来调整包含两个或更多查询的搜索的相关性评分。

boost 值是相对于默认值 1.0 的。 其值在 01.0 之间时会降低相关性评分,而大于 1.0 时会增加相关性评分。

注意

textkeyword类型的字段上使用range查询

如果 search.allow_expensive_queries 设置为 fasle,则在 textkeyword 类型的字段上的范围查询不会被执行。

date类型的字段上使用range查询

<field>参数是一个date类型的字段时,可以将日期计算与以下参数一起使用:

  • gt
  • gte
  • lt
  • lte

例如,下面这个搜索返回timestamp字段包含今天(now)和昨天(now-1d)之间的日期的文档。

GET /_search
{
    "query": {
        "range" : {
            "timestamp" : {
                "gte" : "now-1d/d",
                "lt" :  "now/d"
            }
        }
    }
}
日期计算及舍入

Elasticsearch 对参数中的日期计算的值进行舍入,如下所示:

gt

向上舍入到舍入日期未涵盖的第一个毫秒。

例如,2014-11-18||/M 舍入到2014-12-01T00:00:00.000,不包括整个11月。

gte

向下舍入到第一个毫秒。

例如,2014-11-18||/M 向下舍入到 2014-11-01T00:00:00.000,包含了整个月。

lt

向下舍入到舍入值之前的最后一毫秒。

例如,2014-11-18||/M 向下舍入到 2014-10-31T23:59:59.999,不包括整个11月。

lte

舍入到舍入间隔中最近的一毫秒。

例如,2014-11-18||/M 向上舍入到 2014-11-30T23:59:59.999,包含整个月。

使用time_zone参数的查询示例

可以使用 time_zone参数通过 UTC 时差将 date 值转换为UTC。例如:

GET /_search
{
  "query": {
    "range": {
      "timestamp": {
        "time_zone": "+01:00",        
        "gte": "2020-01-01T00:00:00", 
        "lte": "now"                  
      }
    }
  }
}

指示date值使用+01:00的UTC时差。

使用 UTC 时差+01:00,Elasticsearch 将此日期转换为 2019-12-31T23:00:00 UTC

参数 time_zone 不会影响 now 的值。