Запрос по диапазону
Возвращает документы, содержащие термины в заданном диапазоне.
Пример запроса
Следующий поиск возвращает документы, где поле age содержит термин между 10 и 20.
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 использует формат даты
format, указанный в отображении<field>. Это значение переопределяет этот формат отображения.Для допустимого синтаксиса см.
format.Если формат или значение даты неполные, запрос по диапазону заменяет любые отсутствующие компоненты значениями по умолчанию. См. Отсутствующие компоненты даты.
-
relation -
(Необязательно, строка) Указывает, как запрос по диапазону сопоставляет значения для полей
range. Допустимые значения:-
INTERSECTS(По умолчанию) - Сопоставляет документы со значением поля диапазона, которое пересекается с диапазоном запроса.
-
CONTAINS - Сопоставляет документы со значением поля диапазона, которое полностью содержит диапазон запроса.
-
WITHIN - Сопоставляет документы со значением поля диапазона, которое полностью находится внутри диапазона запроса.
-
-
time_zone -
(Необязательно, строка) Смещение от Coordinated Universal Time (UTC) или IANA часовой пояс, используемый для преобразования значений
dateв запросе в UTC.Допустимые значения — смещения UTC в формате ISO 8601, такие как
+01:00или -08:00, и идентификаторы часовых поясов IANA, такие какAmerica/Los_Angeles.Пример запроса с параметром
time_zoneсм. в Часовой пояс в запросахrange.Параметр
time_zoneне влияет на значение date mathnow.nowвсегда является текущим системным временем в UTC.Однако параметр
time_zoneпреобразует даты, вычисленные с помощьюnowи округления date math. Например, параметрtime_zoneпреобразует значениеnow/d. -
boost -
(Необязательно, число с плавающей запятой) Число с плавающей запятой, используемое для уменьшения или увеличения баллов релевантности запроса. По умолчанию
1.0.Можно использовать параметр
boostдля изменения баллов релевантности для поисков, содержащих два или более запросов.Значения буста относительны к значению по умолчанию
1.0. Значение буста между0и1.0уменьшает балл релевантности. Значение больше1.0увеличивает балл релевантности.
Заметки
Использование запроса range с полями text и keyword
Диапазонные запросы к полям типа text или keyword не будут выполнены, если search.allow_expensive_queries установлено в значение false.
Использование запроса range с полями date
Когда параметр <field> имеет тип данных поля date, можно использовать date math с следующими параметрами:
-
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 преобразует значение gt поля 2099-12 в 2099-12-01T23:59:59.999_999_999Z. Эта дата использует предоставленный год (2099) и месяц (12), но использует значения по умолчанию для дня (01), часа (23), минуты (59), секунды (59) и наносекунды (999_999_999).
Числовое значение диапазона дат
Если формат даты не указан, а диапазонный запрос нацелен на поле даты, числовые значения интерпретируются как миллисекунды с момента эпохи. Если вы хотите, чтобы значение представляло год, например 2020, необходимо передать его как строковое значение (например, "2020"), которое будет проанализировано в соответствии с форматом по умолчанию или заданным форматом.
Date math и округление
Elasticsearch округляет значения date math в параметрах следующим образом:
-
gt -
Округляет вверх до первой миллисекунды, не покрытой округлённой датой.
Например,
2014-11-18||/Mокругляется вверх до2014-12-01T00:00:00.000, исключая весь ноябрь. -
gte -
Округляет вниз до первой миллисекунды.
Например,
2014-11-18||/Mокругляется вниз до2014-11-01T00:00:00.000, включая весь месяц. -
lt -
Округляет вниз до последней миллисекунды перед округлённым значением.
Например,
2014-11-18||/Mокругляется вниз до2014-10-31T23:59:59.999, исключая весь ноябрь. -
lte -
Округляет вверх до последней миллисекунды в интервале округления.
Например,
2014-11-18||/Mокругляется вверх до2014-11-30T23:59:59.999, включая весь месяц.
Пример запроса с использованием параметра time_zone
Вы можете использовать параметр time_zone для преобразования значений date в UTC с использованием смещения 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"
}
}
}
} | Указывает, что значения | |
| Со смещением UTC | |
| Параметр |
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/query-dsl-range-query.html