range

Поиск документов, значения поля которых попадают в указанный диапазон

Запрос range (диапазонный запрос)

Основные возможности

Запрос range позволяет выполнять поиск документов, значения полей которых попадают в указанный диапазон.

Синтаксис базового запроса

GET shakespeare/_search
{
  "query": {
    "range": {
      "line_id": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

Этот запрос находит документы, где значение поля line_id находится в диапазоне от 10 до 20 включительно.

Операторы сравнения

Параметр поля в запросе range принимает следующие операторы:

Оператор Описание
gte Больше или равно
gt Строго больше
lte Меньше или равно
lt Строго меньше

Работа с датами

Пример поиска по датам:

GET products/_search
{
  "query": {
    "range": {
      "created": {
        "gte": "2019/01/01",
        "lte": "2019/12/31"
      }
    }
  }
}

Этот запрос находит все товары, добавленные в 2019 году.

Указание формата даты:

GET /products/_search
{
  "query": {
    "range": {
      "created": {
        "gte": "01/01/2022",
        "lte": "31/12/2022",
        "format":"dd/MM/yyyy"
      }
    }
  }
}

Параметр format позволяет указать формат даты, отличный от формата, заданного в маппинге поля.

Особенности обработки дат

Автозаполнение отсутствующих компонентов даты: OpenSearch заполняет отсутствующие компоненты даты следующими значениями:

  • 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

Пример:

GET /products/_search
{
  "query": {
    "range": {
      "created": {
        "gte": "2022",
        "lte": "2022-12-31"
      }
    }
  }
}

В этом случае начальная дата будет интерпретирована как 2022-01-01T23:59:59.999999999Z.

Относительные даты

Использование математики дат:

GET products/_search
{
  "query": {
    "range": {
      "created": {
        "gte": "2019/01/01||-1y-1d"
      }
    }
  }
}

Здесь 2019/01/01 - это опорная дата, от которой вычитается 1 год и 1 день.

Округление дат:

GET products/_search
{
  "query": {
    "range": {
      "created": {
        "gte": "now-1y/M"
      }
    }
  }
}

Ключевое слово now ссылается на текущую дату и время, /M означает округление по месяцам.

Правила округления относительных дат

| Параметр | Правило округления | Пример для 2022-05-18||/M | |———-|—————————————-|—————————–| | gt | Округляет вверх | 2022-06-01T00:00:00.000 | | gte | Округляет вниз | 2022-05-01T00:00:00.000 | | lt | Округляет вниз до последней миллисекунды | 2022-04-30T23:59:59.999 | | lte | Округляет вверх до последней миллисекунды | 2022-05-31T23:59:59.999 |

Часовые пояса

По умолчанию даты считаются в UTC. Можно указать часовой пояс параметром time_zone:

GET /products/_search
{
  "query": {
    "range": {
      "created": {
        "time_zone": "-04:00",
        "gte": "2022-04-17T06:00:00"
      }
    }
  }
}

Значение 2022-04-17T06:00:00-04:00 будет преобразовано в 2022-04-17T10:00:00 UTC.

Дополнительные параметры

Синтаксис с параметрами:

GET _search
{
  "query": {
    "range": {
      "<поле>": {
        "gt": 10,
        ...
      }
    }
  }
}

Доступные параметры:

Параметр Тип данных Описание
format Строка Формат даты для этого запроса. По умолчанию используется формат, заданный в маппинге поля.
relation Строка Определяет способ сопоставления значений для полей диапазона. Допустимые значения:
- INTERSECTS (по умолчанию): Находит документы, чей диапазон пересекается с запросом
- CONTAINS: Находит документы, чей диапазон полностью содержит запрос
- WITHIN: Находит документы, чей диапазон полностью внутри запроса
boost Число с плавающей точкой Коэффициент усиления релевантности (>1 - увеличивает, 0-1 - уменьшает). По умолчанию: 1.0.
time_zone Строка Часовой пояс для преобразования дат в UTC. Допустимы смещения UTC (например, -04:00) или идентификаторы IANA (например, America/New_York).

Важно: При search.allow_expensive_queries=false диапазонные запросы по текстовым и ключевым полям не выполняются.