Range 查询

Range 查询 #

您可以使用 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"
      }
    }
  }
}

日期数学计算 #

range 查询支持对日期进行数学计算,可以使用 now 占位符来表示当前时间,非常适合构建滑动时间窗口。例如,查找最近一小时内创建的文档:

GET logs/_search
{
  "query": {
    "range": {
      "timestamp": {
        "gte": "now-1h"
      }
    }
  }
}

日期计算还可以应用到某个具体的日期上,在日期后加上双管符号(||)并紧跟日期数学表达式:

GET logs/_search
{
  "query": {
    "range": {
      "timestamp": {
        "gte": "2024-01-01||+1M",
        "lte": "2024-01-01||+2M"
      }
    }
  }
}

常用的日期数学单位:

符号含义示例
ynow-1y(一年前)
Mnow-6M(六个月前)
wnow-2w(两周前)
dnow-7d(七天前)
h小时now-12h(十二小时前)
m分钟now-30m(三十分钟前)
snow-60s(六十秒前)

日期计算是 日历相关 的——它知道每月的具体天数以及闰年等信息。

字符串范围 #

range 查询同样可以处理字符串字段,按照 字典顺序(lexicographically) 排列。在倒排索引中的词项就是按字典顺序排列的,这使得字符串范围查询成为可能。

GET books/_search
{
  "query": {
    "range": {
      "title": {
        "gte": "a",
        "lt": "b"
      }
    }
  }
}

注意基数问题:数字和日期字段的索引方式使高效的范围计算成为可能,但字符串并非如此。Easysearch 需要为范围内的每个词项都执行 term 匹配,因此对高基数字段(唯一词项很多的字段)使用字符串范围会比较慢。字符串范围更适合在低基数字段上使用。

完整参数说明 #

参数数据类型描述
gte数值/字符串/日期大于或等于。可选。
gt数值/字符串/日期大于。可选。
lte数值/字符串/日期小于或等于。可选。
lt数值/字符串/日期小于。可选。
formatString日期字段的格式化模式,如 dd/MM/yyyy。可选。
time_zoneString用于将日期值转换为 UTC 的时区。例如 +08:00Asia/Shanghai。可选。
boostFloat相关性权重。值 > 1.0 增加相关性,0.0~1.0 降低相关性。默认 1.0。
relationStringrange 类型字段指示匹配方式:INTERSECTS(默认)、CONTAINSWITHIN。可选。

传统替代语法:Easysearch 也支持 from/to(等同于 gt/lt)以及 include_lower/include_upper(Boolean,控制是否包含边界值)参数。推荐使用 gte/gt/lte/lt,语义更清晰。