范围查询

编辑

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

示例请求

编辑

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

resp = client.search(
    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)
const response = await client.search({
  query: {
    range: {
      age: {
        gte: 10,
        lte: 20,
        boost: 2,
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20,
        "boost": 2.0
      }
    }
  }
}

range 的顶层参数

编辑
<字段>

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

<字段> 的参数

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

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

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

有关有效的语法,请参见 format

如果格式或日期值不完整,则范围查询将使用默认值替换任何缺失的组件。请参见 缺失的日期组件

relation

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

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

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

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

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

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

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

boost

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

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

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

注意

编辑

textkeyword 字段中使用 range 查询

编辑

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

date 字段中使用 range 查询

编辑

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

  • gt
  • gte
  • lt
  • lte

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

resp = client.search(
    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
const response = await client.search({
  query: {
    range: {
      timestamp: {
        gte: "now-1d/d",
        lte: "now/d",
      },
    },
  },
});
console.log(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,包括整个 11 月。

lt

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

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

lte

向上舍入到舍入间隔中的最新毫秒。

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

使用 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(
    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({
  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 值使用 +01:00 的 UTC 偏移量。

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

time_zone 参数不会影响 now 值。