范围查询

编辑

返回包含指定范围内的术语的文档。

示例请求

编辑

以下搜索返回 age 字段包含 1020 之间术语的文档。

resp = client.search(
    query={
        "range": {
            "age": {
                "gte": 10,
                "lte": 20,
                "boost": 2
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      range: {
        age: {
          gte: 10,
          lte: 20,
          boost: 2
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "range": {
	      "age": {
	        "gte": 10,
	        "lte": 20,
	        "boost": 2.0
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    range: {
      age: {
        gte: 10,
        lte: 20,
        boost: 2,
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20,
        "boost": 2.0
      }
    }
  }
}

range 的顶级参数

编辑
<field>

(必填,对象) 你想要搜索的字段。

<field> 的参数

编辑
gt
(可选) 大于。
gte
(可选) 大于或等于。
lt
(可选) 小于。
lte
(可选) 小于或等于。
format

(可选,字符串) 用于转换查询中 date 值的日期格式。

默认情况下,Elasticsearch 使用 <field> 的映射中提供的 date format。此值会覆盖该映射格式。

有关有效语法,请参见 format

如果格式或日期值不完整,范围查询会将任何缺失的组件替换为默认值。请参见 缺失的日期组件

relation

(可选,字符串) 指示范围查询如何匹配 range 字段的值。有效值为

INTERSECTS (默认)
匹配范围字段值与查询范围相交的文档。
CONTAINS
匹配范围字段值完全包含查询范围的文档。
WITHIN
匹配范围字段值完全在查询范围内的文档。
time_zone

(可选,字符串) 协调世界时 (UTC) 偏移量IANA 时区,用于将查询中的 date 值转换为 UTC。

有效值为 ISO 8601 UTC 偏移量,例如 +01:00 或 -08:00,以及 IANA 时区 ID,例如 America/Los_Angeles

有关使用 time_zone 参数的示例查询,请参见 range 查询中的时区

time_zone 参数不会影响 日期数学nownow 始终是 UTC 中的当前系统时间。

但是,time_zone 参数会转换使用 now日期数学舍入 计算的日期。例如,time_zone 参数将转换 now/d 的值。

boost

(可选,浮点数) 用于降低或提高查询 相关性分数 的浮点数。默认为 1.0

您可以使用 boost 参数来调整包含两个或多个查询的搜索的相关性分数。

Boost 值相对于 1.0 的默认值。介于 01.0 之间的 boost 值会降低相关性分数。大于 1.0 的值会提高相关性分数。

备注

编辑

range 查询与 textkeyword 字段一起使用

编辑

如果 search.allow_expensive_queries 设置为 false,则不会执行 textkeyword 字段上的范围查询。

range 查询与 date 字段一起使用

编辑

<field> 参数是 date 字段数据类型时,您可以使用 日期数学 以及以下参数

  • gt
  • gte
  • lt
  • lte

例如,以下搜索返回 timestamp 字段包含今天和昨天的日期的文档。

resp = client.search(
    query={
        "range": {
            "timestamp": {
                "gte": "now-1d/d",
                "lte": "now/d"
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      range: {
        timestamp: {
          gte: 'now-1d/d',
          lte: 'now/d'
        }
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    range: {
      timestamp: {
        gte: "now-1d/d",
        lte: "now/d",
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "range": {
      "timestamp": {
        "gte": "now-1d/d",
        "lte": "now/d"
      }
    }
  }
}
缺失的日期组件
编辑

对于范围查询和 日期范围 聚合,Elasticsearch 会将缺失的日期组件替换为以下值。不会替换缺失的年份组件。

MONTH_OF_YEAR:    01
DAY_OF_MONTH:     01
HOUR_OF_DAY:      23
MINUTE_OF_HOUR:   59
SECOND_OF_MINUTE: 59
NANO_OF_SECOND:   999_999_999

例如,如果格式为 yyyy-MM,Elasticsearch 会将 gt2099-12 转换为 2099-12-01T23:59:59.999_999_999Z。此日期使用提供的年份 (2099) 和月份 (12),但使用默认日 (01)、小时 (23)、分钟 (59)、秒 (59) 和纳秒 (999_999_999)。

数字日期范围值
编辑

当未指定日期格式并且范围查询的目标是日期字段时,数字值将被解释为自纪元以来的毫秒数。如果你想让值代表年份,例如 2020,你需要将其作为字符串值(例如“2020”)传递,该值将根据默认格式或设置的格式进行解析。

日期数学和舍入
编辑

Elasticsearch 对参数中的 日期数学 值进行舍入,如下所示

gt

舍入到未被舍入日期覆盖的第一个毫秒。

例如,2014-11-18||/M 舍入到 2014-12-01T00:00:00.000,不包括整个 11 月。

gte

舍入到第一个毫秒。

例如,2014-11-18||/M 舍入到 2014-11-01T00:00:00.000,包括整个月份。

lt

舍入到舍入值之前的最后一个毫秒。

例如,2014-11-18||/M 舍入到 2014-10-31T23:59:59.999,不包括整个 11 月。

lte

舍入到舍入间隔中的最后一个毫秒。

例如,2014-11-18||/M 舍入到 2014-11-30T23:59:59.999,包括整个月份。

使用 time_zone 参数的示例查询

编辑

您可以使用 time_zone 参数使用 UTC 偏移量将 date 值转换为 UTC。例如

$params = [
    'body' => [
        'query' => [
            'range' => [
                'timestamp' => [
                    'time_zone' => '+01:00',
                    'gte' => '2020-01-01T00:00:00',
                    'lte' => 'now',
                ],
            ],
        ],
    ],
];
$response = $client->search($params);
resp = client.search(
    query={
        "range": {
            "timestamp": {
                "time_zone": "+01:00",
                "gte": "2020-01-01T00:00:00",
                "lte": "now"
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      range: {
        timestamp: {
          time_zone: '+01:00',
          gte: '2020-01-01T00:00:00',
          lte: 'now'
        }
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "range": {
	      "timestamp": {
	        "time_zone": "+01:00",
	        "gte": "2020-01-01T00:00:00",
	        "lte": "now"
	      }
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  query: {
    range: {
      timestamp: {
        time_zone: "+01:00",
        gte: "2020-01-01T00:00:00",
        lte: "now",
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "range": {
      "timestamp": {
        "time_zone": "+01:00",        
        "gte": "2020-01-01T00:00:00", 
        "lte": "now"                  
      }
    }
  }
}

指示 date 值使用 +01:00 的 UTC 偏移量。

使用 +01:00 的 UTC 偏移量,Elasticsearch 会将此日期转换为 2019-12-31T23:00:00 UTC

time_zone 参数不会影响 now 值。