Range Query(范围查询)

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

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

贡献者 : @小布丁

通过某一个包含项的字段匹配文档。 Lucene 查询的类型取决于字段类型,对于 string (字符串字段),查询是一个 TermRangeQuery ,而对于 number / date 字段,查询是一个 NumericRangeQuery 。下面这个示例返回 age1020 之间的所有文档。

范围查询接受以下参数:

参数 说明
gte 大于或等于
gt 大于
lte 小于或等于
lt 小于
boost 设置查询的 boost 值,默认为 1.0

date (日期)字段的范围查询

对类型为 date (日期)的字段运行 range (范围)查询时,可以使用 Date Math 部分指定范围:

  1. GET _search
  2. {
  3. "query": {
  4. "range" : {
  5. "date" : {
  6. "gte" : "now-1d/d",
  7. "lt" : "now/d"
  8. }
  9. }
  10. }
  11. }

Date math 和 rounding (四舍五入)

当使用 date math 将日期 round (四舍五入)到最近的日,月,小时等时,舍入日期取决于范围的结束是包含还是排除。

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

例如:

参数 说明
gt 大于向上舍入的日期: 2014-11-18 || / M 变成 2014-11-30T23:59:59.999 ,即不包括整个月。
gte 大于或等于向下舍入的日期: 2014-11-18 || / M 即成为 2014-11-01 ,即包括整个月。
lt 小于向下舍入的日期: 2014-11-18 || / M 成为 2014-11-01 ,即不包括整个月。
lte 小于或等于向上舍入的日期: 2014-11-18 || / M 成为 2014-11-30T23:59:59.999 ,即包括整个月。

Range (范围)查询中的日期格式化

格式化的日期将使用指定的默认 format (格式)解析 date (日期)字段,但可以通过将格式参数传递到 range (范围)查询来覆盖默认格式:

  1. GET _search
  2. {
  3. "query": {
  4. "range" : {
  5. "born" : {
  6. "gte": "01/01/2012",
  7. "lte": "2013",
  8. "format": "dd/MM/yyyy||yyyy"
  9. }
  10. }
  11. }
  12. }

Range (范围)查询中的时区

通过在日期值本身指定时区(如果 format 允许),日期可以从另一个时区转换为 UTC ,或者可以将其指定为 time_zone 参数:

  1. GET _search
  2. {
  3. "query": {
  4. "range" : {
  5. "timestamp" : {
  6. "gte": "2015-01-01 00:00:00",
  7. "lte": "now",
  8. "time_zone": "+01:00"
  9. }
  10. }
  11. }
  12. }

①此日期将转换为 2014-12-31T23:00:00 UTC

now 不受 time_zone 参数的影响(日期必须存储为UTC)。