范围查询编辑

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

示例请求编辑

以下搜索返回 age 字段包含介于 1020 之间的词条的文档。

resp = client.search(
    body={"query": {"range": {"age": {"gte": 10, "lte": 20, "boost": 2}}}},
)
print(resp)
response = client.search(
  body: {
    query: {
      range: {
        age: {
          gte: 10,
          lte: 20,
          boost: 2
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "range": {
	      "age": {
	        "gte": 10,
	        "lte": 20,
	        "boost": 2.0
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
GET /_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20,
        "boost": 2.0
      }
    }
  }
}

range 的顶级参数编辑

<field>

(必填,对象)要搜索的字段。

<field> 的参数编辑

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

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

默认情况下,Elasticsearch 使用 <field> 映射中提供的 日期 format。此值将覆盖该映射格式。

有关有效语法,请参阅 format

如果格式或日期值不完整,则范围查询会将所有缺失的组件替换为默认值。请参阅 缺少日期组件

relation

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

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

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

有效值为 ISO 8601 UTC 偏移量(例如 +01:00 或 -08:00)和 IANA 时区 ID(例如 America/Los_Angeles)。

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

time_zone 参数不会 影响 now日期数学 值。now 始终是 UTC 中的当前系统时间。

但是,time_zone 参数会转换使用 now日期数学舍入 计算的日期。例如,time_zone 参数将转换 now/d 的值。

boost

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

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

提升值是相对于默认值 1.0 的。介于 01.0 之间的提升值会降低相关性分数。大于 1.0 的值会增加相关性分数。

注意编辑

range 查询与 textkeyword 字段一起使用编辑

如果 search.allow_expensive_queries 设置为 false,则不会执行对 textkeyword 字段的范围查询。

range 查询与 date 字段一起使用编辑

<field> 参数是 date 字段数据类型时,您可以将 日期数学 与以下参数一起使用

  • gt
  • gte
  • lt
  • lte

例如,以下搜索返回 timestamp 字段包含介于今天和昨天之间的日期的文档。

resp = client.search(
    body={
        "query": {
            "range": {"timestamp": {"gte": "now-1d/d", "lte": "now/d"}}
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      range: {
        timestamp: {
          gte: 'now-1d/d',
          lte: 'now/d'
        }
      }
    }
  }
)
puts response
GET /_search
{
  "query": {
    "range": {
      "timestamp": {
        "gte": "now-1d/d",
        "lte": "now/d"
      }
    }
  }
}
缺少日期组件编辑

对于范围查询和 日期范围 聚合,Elasticsearch 会将缺少的日期组件替换为以下值。不会替换缺少的年份组件。

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

例如,如果格式为 yyyy-MM,则 Elasticsearch 会将 gt2099-12 转换为 2099-12-01T23:59:59.999_999_999Z。此日期使用提供的年份 (2099) 和月份 (12),但使用默认的日期 (01)、小时 (23)、分钟 (59)、秒 (59) 和纳秒 (999_999_999)。

数字日期范围值编辑

如果未指定日期格式,并且范围查询的目标是日期字段,则数字值将被解释为表示自纪元以来的毫秒数。如果您希望该值表示年份(例如 2020),则需要将其作为字符串值(例如“2020”)传递,该值将根据默认格式或设置的格式进行解析。

日期数学和舍入编辑

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。例如

$params = [
    'body' => [
        'query' => [
            'range' => [
                'timestamp' => [
                    'time_zone' => '+01:00',
                    'gte' => '2020-01-01T00:00:00',
                    'lte' => 'now',
                ],
            ],
        ],
    ],
];
$response = $client->search($params);
resp = client.search(
    body={
        "query": {
            "range": {
                "timestamp": {
                    "time_zone": "+01:00",
                    "gte": "2020-01-01T00:00:00",
                    "lte": "now",
                }
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      range: {
        timestamp: {
          time_zone: '+01:00',
          gte: '2020-01-01T00:00:00',
          lte: 'now'
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "range": {
	      "timestamp": {
	        "time_zone": "+01:00",
	        "gte": "2020-01-01T00:00:00",
	        "lte": "now"
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  body: {
    query: {
      range: {
        timestamp: {
          time_zone: '+01:00',
          gte: '2020-01-01T00:00:00',
          lte: 'now'
        }
      }
    }
  }
})
console.log(response)
GET /_search
{
  "query": {
    "range": {
      "timestamp": {
        "time_zone": "+01:00",        
        "gte": "2020-01-01T00:00:00", 
        "lte": "now"                  
      }
    }
  }
}

表示 date 值使用 UTC 偏移量 +01:00

使用 UTC 偏移量 +01:00,Elasticsearch 会将此日期转换为 2019-12-31T23:00:00 UTC

time_zone 参数不会影响 now 值。