exists

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

Запрос exists

Назначение

Запрос exists используется для поиска документов, содержащих указанное поле.

Когда поле считается отсутствующим?

Индексированное значение будет отсутствовать для поля документа в следующих случаях:

  1. В маппинге поля указано "index": false
  2. Значение поля в исходном JSON равно null или [] (пустой массив)
  3. Длина значения поля превышает параметр ignore_above в маппинге
  4. Значение поля имеет некорректный формат и в маппинге определен ignore_malformed

Когда поле считается существующим?

Индексированное значение будет присутствовать для поля документа в следующих случаях:

  1. Значение является массивом, содержащим как null, так и не-null элементы (например, ["один", null])
  2. Значение представляет собой пустую строку ("" или "-")
  3. Значение является кастомным null_value, определенным в маппинге поля

Пример использования

Добавление тестовых документов:

PUT testindex/_doc/1
{
  "title": "Ветер крепчает"
}

PUT testindex/_doc/2
{
  "title": "Унесенные ветром",
  "description": "Американский эпический исторический фильм 1939 года"
}

Поиск документов с полем description:

GET testindex/_search
{
  "query": {
    "exists": {
      "field": "description"
    }
  }
}

Результат выполнения:

{
  "took": 3,
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "hits": [
      {
        "_index": "testindex",
        "_id": "2",
        "_source": {
          "title": "Унесенные ветром",
          "description": "Американский эпический исторический фильм 1939 года"
        }
      }
    ]
  }
}

Поиск документов с отсутствующими полями

Для поиска документов без определенного поля используйте комбинацию must_not и exists:

GET testindex/_search
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "description"
        }
      }
    }
  }
}

Результат выполнения:

{
  "took": 19,
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "hits": [
      {
        "_index": "testindex",
        "_id": "1",
        "_source": {
          "title": "Ветер крепчает"
        }
      }
    ]
  }
}

Параметры запроса

Запрос принимает следующие параметры:

Параметр Тип данных Описание
field Строка Обязательное поле. Имя поля, которое должно существовать в документе.
boost Число с плавающей точкой Определяет вес поля при расчете релевантности. Значения >1 увеличивают вес, значения между 0 и 1 уменьшают вес. По умолчанию: 1.0.

Пример с параметром boost:

GET testindex/_search
{
  "query": {
    "exists": {
      "field": "description",
      "boost": 2.0
    }
  }
}

Особенности работы

  1. Запрос exists проверяет именно наличие индексированного значения поля, а не его наличие в исходном документе.
  2. Для проверки отсутствия поля всегда используйте комбинацию bool + must_not + exists.
  3. Запрос можно комбинировать с другими типами запросов в составе bool запроса.