# Range Query(范围查询)

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html)

译文链接 : [http://www.apache.wiki/pages/viewpage.action?pageId=4260599](http://www.apache.wiki/pages/viewpage.action?pageId=4260599)

贡献者 : @小布丁

通过某一个包含项的字段匹配文档。 **Lucene** 查询的类型取决于字段类型，对于 _string_ （字符串字段），查询是一个 **TermRangeQuery** ，而对于 _number / date_ 字段，查询是一个 **NumericRangeQuery **。下面这个示例返回 _age_ 在 _10_ 到 _20_ 之间的所有文档。

范围查询接受以下参数：

| 参数 | 说明 |
| --- | --- |
| gte | 大于或等于 |
| gt | 大于 |
| lte | 小于或等于 |
| lt | 小于 |
| boost | 设置查询的 _boost_ 值，默认为 _1.0_ |

##  date （日期）字段的范围查询

对类型为 [**date** ](https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html)（日期）的字段运行 **range** （范围）查询时，可以使用 _“[Date Math](https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#date-math)”_ 部分指定范围：

```
GET _search
{
    "query": {
        "range" : {
            "date" : {
                "gte" : "now-1d/d",
                "lt" :  "now/d"
            }
        }
    }
}
```

###  Date math 和 rounding （四舍五入）

当使用 **[date math](https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#date-math)** 将日期 _round_ （四舍五入）到最近的日，月，小时等时，舍入日期取决于范围的结束是包含还是排除。

向上舍入移动到舍入范围的最后一个毫秒，并向下舍入到舍入范围的第一个毫秒。

例如：

| 参数 | 说明 |
| --- | --- |
| gt | 大于向上舍入的日期： _2014-11-18 &#124;&#124; / M_ 变成 _2014-11-30T23：59：59.999_ ，即不包括整个月。 |
| gte | 大于或等于向下舍入的日期： _2014-11-18 &#124;&#124; / M_ 即成为 _2014-11-01_ ，即包括整个月。 |
| lt | 小于向下舍入的日期： _2014-11-18 &#124;&#124; / M_ 成为 _2014-11-01_ ，即不包括整个月。 |
| lte | 小于或等于向上舍入的日期： _2014-11-18 &#124;&#124; / M_ 成为 _2014-11-30T23：59：59.999_ ，即包括整个月。 |

###  Range （范围）查询中的日期格式化

格式化的日期将使用指定的默认 **[format](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html)** （格式）解析 [**date**](https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html) （日期）字段，但可以通过将格式参数传递到 **range** （范围）查询来覆盖默认格式：

```
GET _search
{
    "query": {
        "range" : {
            "born" : {
                "gte": "01/01/2012",
                "lte": "2013",
                "format": "dd/MM/yyyy||yyyy"
            }
        }
    }
}
```

###  Range （范围）查询中的时区

通过在日期值本身指定时区（如果 **[format](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html)** 允许），日期可以从另一个时区转换为 **UTC** ，或者可以将其指定为 _time_zone_ 参数：

```
GET _search
{
    "query": {
        "range" : {
            "timestamp" : {
                "gte": "2015-01-01 00:00:00", ①
                "lte": "now", ②
                "time_zone": "+01:00"
            }
        }
    }
}
```

①此日期将转换为 _2014-12-31T23：00：00 UTC_ 。

② _now_ 不受 _time_zone_ 参数的影响（日期必须存储为UTC）。