Link Search Menu Expand Document Documentation Menu

范围查询

您可以使用 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,则不对 textkeyword 字段执行范围查询。

剩余 350 字符

有问题?

想要贡献?