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"
}
}
}
}
常用的日期数学单位:
| 符号 | 含义 | 示例 |
|---|---|---|
y | 年 | now-1y(一年前) |
M | 月 | now-6M(六个月前) |
w | 周 | now-2w(两周前) |
d | 天 | now-7d(七天前) |
h | 小时 | now-12h(十二小时前) |
m | 分钟 | now-30m(三十分钟前) |
s | 秒 | now-60s(六十秒前) |
日期计算是 日历相关 的——它知道每月的具体天数以及闰年等信息。
字符串范围 #
range 查询同样可以处理字符串字段,按照 字典顺序(lexicographically) 排列。在倒排索引中的词项就是按字典顺序排列的,这使得字符串范围查询成为可能。
GET books/_search
{
"query": {
"range": {
"title": {
"gte": "a",
"lt": "b"
}
}
}
}
注意基数问题:数字和日期字段的索引方式使高效的范围计算成为可能,但字符串并非如此。Easysearch 需要为范围内的每个词项都执行
term匹配,因此对高基数字段(唯一词项很多的字段)使用字符串范围会比较慢。字符串范围更适合在低基数字段上使用。
完整参数说明 #
| 参数 | 数据类型 | 描述 |
|---|---|---|
gte | 数值/字符串/日期 | 大于或等于。可选。 |
gt | 数值/字符串/日期 | 大于。可选。 |
lte | 数值/字符串/日期 | 小于或等于。可选。 |
lt | 数值/字符串/日期 | 小于。可选。 |
format | String | 日期字段的格式化模式,如 dd/MM/yyyy。可选。 |
time_zone | String | 用于将日期值转换为 UTC 的时区。例如 +08:00 或 Asia/Shanghai。可选。 |
boost | Float | 相关性权重。值 > 1.0 增加相关性,0.0~1.0 降低相关性。默认 1.0。 |
relation | String | 对 range 类型字段指示匹配方式:INTERSECTS(默认)、CONTAINS 或 WITHIN。可选。 |
传统替代语法:Easysearch 也支持
from/to(等同于gt/lt)以及include_lower/include_upper(Boolean,控制是否包含边界值)参数。推荐使用gte/gt/lte/lt,语义更清晰。