Термино-уровневые запросы
Общее описание
Термино-уровневые запросы (term-level queries) выполняют поиск по индексу для нахождения документов, содержащих точное соответствие указанному термину. В отличие от полнотекстовых запросов, результаты термино-уровневых запросов не сортируются по оценке релевантности.
Ключевые особенности:
- Работают только с точными значениями
- Не анализируют поисковый термин
- Оптимальны для поиска по полям типа
keyword
- Не подходят для анализа текстовых полей (используйте полнотекстовые запросы)
Типы термино-уровневых запросов
В таблице представлены все виды термино-уровневых запросов:
Тип запроса | Описание |
---|---|
term |
Поиск документов, содержащих точное соответствие указанному термину в заданном поле |
terms |
Поиск документов, содержащих один или несколько указанных терминов в заданном поле |
terms_set |
Поиск документов, соответствующих минимальному количеству указанных терминов |
ids |
Поиск документов по их идентификаторам |
range |
Поиск документов, значения поля которых попадают в указанный диапазон |
prefix |
Поиск документов, содержащих термины с указанным префиксом |
exists |
Поиск документов, имеющих любое проиндексированное значение в указанном поле |
fuzzy |
Поиск документов, содержащих термины, схожие с поисковым термином в пределах максимально допустимого расстояния Дамерау-Левенштейна (количество односимвольных изменений для преобразования одного термина в другой) |
wildcard |
Поиск документов, содержащих термины, соответствующие шаблону с подстановочными символами |
regexp |
Поиск документов, содержащих термины, соответствующие регулярному выражению |
Практические рекомендации
-
Для полей
keyword
всегда используйте термино-уровневые запросы:GET products/_search { "query": { "term": { "product_code": "ABC-123" } } }
-
Избегайте использования термино-уровневых запросов для полей типа
text
, так как они проходят анализ при индексации. -
Для сложных условий комбинируйте несколько термино-уровневых запросов через
bool
:GET logs/_search { "query": { "bool": { "must": [ { "term": { "status": "error" } }, { "range": { "timestamp": { "gte": "2023-01-01" }}} ] } } }
-
Для нечеткого поиска используйте
fuzzy
с указанием максимального расстояния:GET contacts/_search { "query": { "fuzzy": { "last_name": { "value": "Smith", "fuzziness": 2 } } } }
Все технические термины сохранены в оригинальном написании (term, fuzzy, wildcard и т.д.) для соответствия международной практике, с добавлением пояснений на русском языке для лучшего понимания.