Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Руководство [8.17] ›DSL запросов ›Запросы на уровне терминов

Запрос по диапазону

Возвращает документы, содержащие термины в заданном диапазоне.

Пример запроса

Следующий поиск возвращает документы, где поле 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 math now. 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"                  
      }
    }
  }
}

Указывает, что значения date используют смещение UTC +01:00.

Со смещением UTC +01:00 Elasticsearch преобразует эту дату в 2019-12-31T23:00:00 UTC.

Параметр time_zone не влияет на значение now.

© 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

END_OF_DOCUMENT_MARKER

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API