Запросы на уровне термина в Elasticsearch: term запрос

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

Вы можете использовать term запрос для поиска документов на основе точного значения, такого как цена, идентификатор продукта или имя пользователя.

Избегайте использования term запроса для текстовых полей.

По умолчанию Elasticsearch изменяет значения текстовых полей как часть анализа. Это может затруднить поиск точных совпадений для значений текстовых полей.

Для поиска значений текстового поля используйте вместо этого match запрос.

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

GET /_search
{
  "query": {
    "term": {
      "user.id": {
        "value": "cat",
        "boost": 1.0
      }
    }
  }
}

Параметры верхнего уровня для term запроса

field

(Обязательный, объект) Поле для поиска.

Параметры для field

value

(Обязательный, строка) Термин, который вы хотите найти в указанном поле field. Чтобы вернуть документ, термин должен точно соответствовать значению поля, включая пробелы и заглавные буквы.

boost

(Необязательный, число с плавающей запятой) Число с плавающей запятой, используемое для уменьшения или увеличения оценок релевантности запроса. По умолчанию 1.0.

Вы можете использовать параметр boost для настройки оценок релевантности для поисков, содержащих два или более запросов.

Значения boost относятся к значению по умолчанию 1.0. Значение boost от 0 до 1.0 снижает оценку релевантности. Значение больше 1.0 увеличивает оценку релевантности.

case_insensitive

(Необязательный, логическое значение) Позволяет в ASCII без учета регистра сопоставить значение со значениями индексированного поля, если задано значение true. По умолчанию - false, что означает, что чувствительность к регистру при сопоставлении зависит от сопоставления базового поля.

Избегайте использования term запроса для текстовых полей

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

  • Удаляет большинство знаков препинания
  • Делит оставшееся содержимое на отдельные слова, называемые токенами
  • Приводит токены к нижнему регистру

Чтобы улучшить поиск по текстовым полям, match запрос также анализирует указанный вами поисковый запрос перед выполнением поиска. Это означает, что match запрос может искать в текстовых полях проанализированные токены, а не точный термин.

term запрос не анализирует поисковый запрос. Запрос термина ищет только тот термин, который вы указали. Это означает, что запрос термина может возвращать плохие или нулевые результаты при поиске по текстовым полям.

Чтобы увидеть разницу в результатах поиска, попробуйте следующий пример.

Создайте индекс с текстовым полем с именем full_text.

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "full_text": { "type": "text" }
    }
  }
}

Индексируйте документ со значением Quick Brown Foxes! в поле full_text.

PUT my-index-000001/_doc/1
{
  "full_text":   "Quick Brown Foxes!"
}

Поскольку full_text является текстовым полем, Elasticsearch изменяет Quick Brown Foxes! на [quick, brown, fox] во время анализа.

Используйте term запрос для поиска Quick Brown Foxes! в поле full_text. Включите параметр pretty, чтобы ответ был более читабельным.

GET my-index-000001/_search?pretty
{
  "query": {
    "term": {
      "full_text": "Quick Brown Foxes!"
    }
  }
}

Поскольку поле full_text больше не содержит точного термина Quick Brown Foxes!, поиск по term запросу не дает результатов.

Используйте match запрос для поиска Quick Brown Foxes! в поле full_text.

GET my-index-000001/_search?pretty
{
  "query": {
    "match": {
      "full_text": "Quick Brown Foxes!"
    }
  }
}

В отличие от term запроса, match запрос анализирует указанный вами поисковый запрос Quick Brown Foxes!, прежде чем выполнять поиск. Затем match запрос возвращает все документы, содержащие токены quick, brown или fox в поле full_text.

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

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.8630463,
    "hits" : [
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.8630463,
        "_source" : {
          "full_text" : "Quick Brown Foxes!"
        }
      }
    ]
  }
}


Читайте также:

Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Нормальные формы, пример нормализации в базе данных

Хэш-таблица: разрешение коллизий