---
title: "Range 查询"
date: 0001-01-01
summary: "Range 查询 #  您可以使用 range 查询搜索字段中的值范围。
相关指南（先读这些） #    结构化搜索  Query DSL 基础  要搜索 line_id 值为 &gt;= 10 和 &lt;= 20 的文档，请使用以下请求：
GET shakespeare/_search { &#34;query&#34;: { &#34;range&#34;: { &#34;line_id&#34;: { &#34;gte&#34;: 10, &#34;lte&#34;: 20 } } } } 运算符 #  范围查询中的字段参数接受以下可选运算符参数：
 gte：大于或等于 gt：大于 lte：小于或等于 lt：小于  日期字段 #  您可以对包含日期的字段使用范围查询。例如，假设您有一个products索引，并且想要查找 2019 年添加的所有产品：
GET products/_search { &#34;query&#34;: { &#34;range&#34;: { &#34;created&#34;: { &#34;gte&#34;: &#34;2019/01/01&#34;, &#34;lte&#34;: &#34;2019/12/31&#34; } } } } 日期格式 #  要在查询中使用字段映射格式以外的日期格式，请在 format 字段中指定它。"
---


# Range 查询

您可以使用 `range` 查询搜索字段中的值范围。

## 相关指南（先读这些）

- [结构化搜索]({{< relref "/docs/features/query-dsl/structured-search.md" >}})
- [Query DSL 基础]({{< relref "/docs/features/query-dsl/query-dsl-basics.md" >}})

要搜索 `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`，语义更清晰。

