范围查询
您可以使用 range
查询在字段中搜索值的范围。
要搜索 line_id
值 >= 10 且 <= 20 的文档,请使用以下请求
GET shakespeare/_search
{
"query": {
"range": {
"line_id": {
"gte": 10,
"lte": 20
}
}
}
}
运算符
范围查询中的字段参数接受以下可选运算符参数
gte
: 大于或等于gt
: 大于lte
: 小于或等于lt
: 小于
日期字段
您可以在包含日期的字段上使用范围查询。例如,假设您有一个 products
索引,并且您想查找所有在 2019 年添加的产品
GET products/_search
{
"query": {
"range": {
"created": {
"gte": "2019/01/01",
"lte": "2019/12/31"
}
}
}
}
有关支持的日期格式的更多信息,请参阅格式。
格式
要在查询中使用字段映射格式以外的日期格式,请在 format
字段中指定。
例如,如果 products
索引将 created
字段映射为 strict_date_optional_time
,则可以按如下方式为查询日期指定不同的格式
GET /products/_search
{
"query": {
"range": {
"created": {
"gte": "01/01/2022",
"lte": "31/12/2022",
"format":"dd/MM/yyyy"
}
}
}
}
缺失的日期组件
OpenSearch 使用以下值填充缺失的日期组件
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
如果年份缺失,则不会填充。
例如,考虑以下请求,它仅在开始日期中指定年份
GET /products/_search
{
"query": {
"range": {
"created": {
"gte": "2022",
"lte": "2022-12-31"
}
}
}
}
开始日期使用默认值填充,因此使用的 gte
参数是 2022-01-01T23:59:59.999999999Z
。
相对日期
您可以通过使用日期数学来指定相对日期。
要从指定日期减去 1 年和 1 天,请使用以下查询
GET products/_search
{
"query": {
"range": {
"created": {
"gte": "2019/01/01||-1y-1d"
}
}
}
}
在前面的示例中,2019/01/01
是日期数学的锚定日期(起点)。在两个管道符 (||
) 之后,您正在指定相对于锚定日期的数学表达式。在此示例中,您正在减去 1 年 (-1y
) 和 1 天 (-1d
)。
您还可以通过在日期或时间单位后添加斜杠来四舍五入日期。
要查找过去一年内添加的产品,并按月四舍五入,请使用以下查询
GET products/_search
{
"query": {
"range": {
"created": {
"gte": "now-1y/M"
}
}
}
}
关键字 now
指的是当前日期和时间。
相对日期舍入
下表指定了相对日期的舍入方式。
参数 | 舍入规则 | 示例:值 2022-05-18||/M 舍入为 |
---|---|---|
gt | 向上舍入到不在舍入区间内的第一个毫秒。 | 2022-06-01T00:00:00.000 |
gte | 向下舍入到第一个毫秒。 | 2022-05-01T00:00:00.000 |
lt | 向下舍入到舍入日期之前的最后一个毫秒。 | 2022-04-30T23:59:59.999 |
lte | 向上舍入到舍入区间内的最后一个毫秒。 | 2022-05-31T23:59:59.999 |
时区
默认情况下,日期假定为世界协调时间 (UTC)。如果您在查询中指定 time_zone
参数,则提供的日期值将转换为 UTC。您可以将 time_zone
参数指定为 UTC 偏移量,例如 -04:00
,或 IANA 时区 ID,例如 America/New_York
。例如,以下查询指定查询中提供的 gte
日期位于 -04:00
时区
GET /products/_search
{
"query": {
"range": {
"created": {
"time_zone": "-04:00",
"gte": "2022-04-17T06:00:00"
}
}
}
}
前述查询中的 gte
参数将转换为 2022-04-17T10:00:00 UTC
,这是 2022-04-17T06:00:00-04:00
的 UTC 等效时间。
time_zone
参数不影响 now
值,因为 now
始终对应于当前系统在 UTC 的时间。
参数
查询接受字段名称 (<field>
) 作为顶级参数
GET _search
{
"query": {
"range": {
"<field>": {
"gt": 10,
...
}
}
}
}
除了运算符之外,您还可以为 <field>
指定以下可选参数。
参数 | 数据类型 | 描述 |
---|---|---|
format | 字符串 | 此查询中日期的格式。默认为字段的映射格式。 |
relation | 字符串 | 指示范围查询如何匹配range 字段的值。有效值为- INTERSECTS (默认):匹配其 range 字段值与查询中提供的范围相交的文档。- CONTAINS :匹配其 range 字段值包含查询中提供的整个范围的文档。- WITHIN :匹配其 range 字段值完全在查询中提供的范围内的文档。 |
提升 | Floating-point | 一个浮点值,指定此字段对相关性得分的权重。高于 1.0 的值会增加字段的相关性。介于 0.0 和 1.0 之间的值会降低字段的相关性。默认值为 1.0。 |
time_zone | 字符串 | 用于将查询中的date 值转换为 UTC 的时区。有效值为 ISO 8601 UTC 偏移量和 IANA 时区 ID。有关更多信息,请参阅时区。 |
如果 search.allow_expensive_queries
设置为 false
,则不对 text
和 keyword
字段执行范围查询。