Разберём анализ, обязательность слов, фразы и поиск по нескольким полям.
Примеры course-products используют учебную схему и товар из главы 5 «Mapping и типы полей». Разборы упражнений ниже используют отдельный публичный набор тренажёра.
- match и обязательность слов
- Порядок и близость
- Несколько полей
Разберём анализ, обязательность слов, фразы и поиск по нескольким полям.
Курс ориентирован на Elasticsearch 9.4.3. Разборы упражнений используют публичный набор products; остальные запросы показывают отдельные учебные индексы и могут требовать подготовки или прав, недоступных в тренажёре. Ответы сокращены, score может меняться. Для расширенных функций проверяйте лицензию и вариант развёртывания.
match и обязательность слов
match анализирует вход и строит запрос по полученным термам. operator=or обычно допускает отдельные слова, operator=and требует все. minimum_should_match задаёт промежуточную строгость. Для длинных запросов абсолютное AND может терять полезные товары, поэтому выбирают правило на основе качества. Нулевое число токенов после стоп-фильтра требует осознанной политики zero_terms_query.
СамопроверкаПорядок и близость
match_phrase учитывает позиции. slop разрешает позиционные отклонения и не равен простому числу лишних слов во всех случаях: перестановка тоже имеет стоимость. Фраза не означает сравнение всей исходной строки, потому что анализ уже произошёл. Для точного названия целиком нужен отдельный keyword-путь, если это требование продукта.
СамопроверкаНесколько полей
multi_match best_fields ориентируется на лучшее поле, most_fields суммирует сигналы разных представлений, cross_fields помогает распределить термы между совместимыми полями. combined_fields рассматривает совместимые text-поля как объединённое поисковое представление с ограничениями анализаторов. Название и описание не всегда стоит объединять: различия длины и назначения могут требовать явных boost.
Название усилено, но совпадение в описании остаётся допустимым.
{
"query": {
"multi_match": {
"query": "wireless headphones",
"fields": [
"name^3",
"description"
],
"type": "best_fields"
}
}
}Как читать результат
Название усилено, но совпадение в описании остаётся допустимым.
Разбор на примере каталога
Пусть товар A имеет name="wireless headphones", товар B — name="headphones" и description="wireless charging case". Запрос по двум полям может найти оба товара, но с разным смыслом совпадения. Если все слова должны присутствовать в одном поле, это не то же самое, что присутствовать где-нибудь в объединённом наборе. Сначала сформулируйте правило словами, затем выберите тип multi_match или combined_fields. Добавьте товар, где слова распределены между полями, как обязательный тест этой разницы.
СамопроверкаПоиск по тексту
match — отправная точка поиска по text. Вход TRAVEL анализируется и может совпасть с Travel в name. Результат определяется терминами, а не сравнением исходной JSON-строки с учётом регистра. Оценка характеризует совпадение в текущем корпусе, а не процент уверенности.
Для нескольких входных слов по умолчанию действует operator or: может хватить одного проанализированного слова. Это полезно для широкого поиска, но не означает обязательность всех слов или совпадение фразы. Следующие разделы задают эти требования явно.
Разберём другой сценарий
{
"query": {
"match": {
"name": "TRAVEL"
}
},
"size": 2,
"_source": [
"name",
"price"
]
}Ответ Elasticsearch
{
"hits": {
"total": {
"value": 60,
"relation": "eq"
},
"hits": [
{
"_id": "3",
"_score": 1.6332386,
"_source": {
"name": "Sony Travel Speaker 3",
"price": 100
}
},
{
"_id": "13",
"_score": 1.6332386,
"_source": {
"name": "Apple Travel Speaker 13",
"price": 100
}
}
]
}
}Как читать результат
Названия содержат проанализированный термин travel, несмотря на верхний регистр входа. Сравните это с регистрозависимым term по keyword.
Поиск фразы
match_phrase учитывает позиции токенов наряду с терминами. При slop по умолчанию, равном нулю, слова должны стоять рядом и в том же порядке. Пример ищет gaming keyboard; название с keyboard перед gaming является другой фразой, хотя содержит оба слова.
Поиск фразы также анализирует текст. Он не требует равенства всего поля фразе: длинное название может содержать её внутри последовательности токенов. Точное равенство всей строки относится к подходящему keyword-полю, а не к match_phrase.
- gaming + keyboard
- Gaming Keyboard: фраза + И
- Keyboard for Gaming: только И
Одна пара токенов может пройти поиск И, но не точную фразу.
Разберём другой сценарий
{
"query": {
"match_phrase": {
"name": "gaming keyboard"
}
},
"size": 2,
"_source": [
"name",
"price"
]
}Ответ Elasticsearch
{
"hits": {
"total": {
"value": 30,
"relation": "eq"
},
"hits": [
{
"_id": "4",
"_score": 4.6608744,
"_source": {
"name": "Logitech Gaming Keyboard 4",
"price": 199
}
},
{
"_id": "14",
"_score": 4.6608744,
"_source": {
"name": "Samsung Gaming Keyboard 14",
"price": 199
}
}
]
}
}Как читать результат
Фраза встречается в том же порядке в подходящих названиях. Дополнительные слова до или после неё не мешают совпадению.
Поиск по нескольким полям
multi_match применяет текстовый запрос к явно перечисленным полям. Поиск по name и description находит товар, даже если нужная формулировка есть только в описании. Стратегия best_fields по умолчанию определяет релевантность по лучшему полю, а не просто добавляет по баллу за каждое совпадение.
Названия полей указываются в массиве fields. Значения анализируются по mapping каждого поля. Тренажёр требует явный разрешённый список, поэтому wildcard в селекторе полей использовать не нужно. Возвращаемые поля _source не определяют поля поиска.
Разберём другой сценарий
{
"query": {
"multi_match": {
"query": "gaming",
"fields": [
"name",
"description"
]
}
},
"size": 2,
"_source": [
"name",
"description"
]
}Ответ Elasticsearch
{
"hits": {
"total": {
"value": 30,
"relation": "eq"
},
"hits": [
{
"_id": "4",
"_score": 2.3304372,
"_source": {
"name": "Logitech Gaming Keyboard 4",
"description": "Reliable everyday accessory"
}
},
{
"_id": "14",
"_score": 2.3304372,
"_source": {
"name": "Samsung Gaming Keyboard 14",
"description": "Travel companion with long battery life"
}
}
]
}
}Как читать результат
Просмотрите оба текстовых поля, чтобы найти причину совпадения. Отсутствие слова только в name ещё не означает ошибочный результат.
Все слова обязательны
Объект match может содержать query и operator. Значение operator: and требует каждый проанализированный термин в одном поле. В примере travel и speaker должны встречаться в name. Соседство не требуется; это также не равенство строки полному названию товара.
Не путайте И между терминами с bool.must между разными запросами. Оба задают совместное выполнение, но на разных уровнях. Если задача требует все слова в одном поле, match с operator and прямо выражает это намерение.
Разберём другой сценарий
{
"query": {
"match": {
"name": {
"query": "travel speaker",
"operator": "and"
}
}
},
"size": 2,
"_source": [
"name",
"price"
]
}Ответ Elasticsearch
{
"hits": {
"total": {
"value": 30,
"relation": "eq"
},
"hits": [
{
"_id": "3",
"_score": 3.9636757,
"_source": {
"name": "Sony Travel Speaker 3",
"price": 100
}
},
{
"_id": "13",
"_score": 3.9636757,
"_source": {
"name": "Apple Travel Speaker 13",
"price": 100
}
}
]
}
}Как читать результат
Название только с travel или только со speaker исключается. Сравните total с более широким вариантом OR по умолчанию.
Самопроверка
Сначала ответьте самостоятельно, затем раскройте объяснение.
1. Что анализирует match?
Поисковый текст анализатором поля или указанным поисковым анализатором.
2. AND всегда лучше?
Нет, он может резко уменьшить полноту на длинных запросах.
3. Фраза равна всей строке?
Нет, она проверяет последовательность проанализированных токенов.
4. Когда most_fields?
Когда разные представления текста должны давать совместные сигналы.
5. Можно ли без проверки объединить любые поля?
Нет, учитывают типы, анализаторы и смысл каждого поля.
Краткая памятка
- Поисковый текст анализатором поля или указанным поисковым анализатором.
- Нет, он может резко уменьшить полноту на длинных запросах.
- Нет, она проверяет последовательность проанализированных токенов.
- Когда разные представления текста должны давать совместные сигналы.
- Нет, учитывают типы, анализаторы и смысл каждого поля.
Официальная документация
Готовы применить знания?
Подтвердите прочтение, чтобы сохранить своё место. Чтение и решение заданий учитываются отдельно в этом браузере с помощью гостевой cookie.