Добавим популярность и свежесть так, чтобы сохранить смысл текстового поиска.
Примеры course-products используют учебную схему и товар из главы 5 «Mapping и типы полей». Разборы упражнений ниже используют отдельный публичный набор тренажёра.
- Кандидаты и предпочтения
- Функции и нормализация
- Скрипты и второй этап
Добавим популярность и свежесть так, чтобы сохранить смысл текстового поиска.
Курс ориентирован на Elasticsearch 9.4.3. Разборы упражнений используют публичный набор products; остальные запросы показывают отдельные учебные индексы и могут требовать подготовки или прав, недоступных в тренажёре. Ответы сокращены, score может меняться. Для расширенных функций проверяйте лицензию и вариант развёртывания.
Кандидаты и предпочтения
Сначала отделяют обязательные ограничения: доступ к данным, наличие и допустимая категория. Затем ранжируют подходящих кандидатов. Популярный товар другой категории не должен появляться только из-за большого бизнес-сигнала. У каждого сигнала есть диапазон и распределение: число продаж от 0 до миллиона нельзя бездумно складывать с текстовым score.
СамопроверкаФункции и нормализация
function_score объединяет исходную оценку и функции через boost_mode и score_mode. field_value_factor использует числовое поле; логарифмические модификаторы помогают сжать большие значения, но требуют допустимого диапазона. Decay functions постепенно уменьшают вклад с удалением от даты, цены или координаты. rank_feature рассчитан на подготовленные положительные признаки и требует соответствующего mapping.
СамопроверкаСкрипты и второй этап
script_score гибок, но вычисления на многих кандидатах могут быть дорогими. Итоговый score должен быть допустимым неотрицательным числом. Rescore применяет более дорогую оценку к окну лучших документов на каждом шарде; слишком маленькое окно ограничивает возможные улучшения. Проверяйте не только верхний товар, но и устойчивость порядка для редких запросов и отсутствующих признаков.
Умножение связывает текстовый score и рейтинг; проверьте диапазон рейтинга и пропуски.
{
"query": {
"function_score": {
"query": {
"match": {
"name": "headphones"
}
},
"field_value_factor": {
"field": "rating",
"modifier": "sqrt",
"missing": 1
},
"boost_mode": "multiply"
}
}
}Как читать результат
Умножение связывает текстовый score и рейтинг; проверьте диапазон рейтинга и пропуски.
Разбор на примере каталога
Представьте текстовые score 8 и 6 и продажи 10 и 100000. Простое умножение почти гарантированно продвинет второй товар независимо от текстовой разницы. Логарифм или функция насыщения сжимает масштаб, а ограниченное влияние сохраняет шанс сильного текстового совпадения. Не выбирайте коэффициент по этим двум числам: проверьте распределение продаж, товары без истории, новые товары и запросы по точным моделям. У каждого случая могут быть разные последствия для бизнеса.
СамопроверкаРелевантность с ограничениями
Разделите три роли: must описывает текстовую релевантность, filter — допуск, must_not — исключения. Пример ищет travel по name^3 и description, требует наличие и цену ниже 800, затем исключает preorder. multi_match должен оставаться в поисковом пути must, а не внутри локального или внешнего filter.
Не добавляйте сортировку по полю, если цель — порядок по релевантности. Boost в несвязанном условии или агрегации не придаёт нужный вес реальному текстовому запросу. Проверяйте полный набор совпадений и взаимный порядок, а не фиксированную оценку одного документа.
Разберём другой сценарий
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "travel",
"fields": [
"name^3",
"description"
]
}
}
],
"filter": [
{
"term": {
"in_stock": true
}
},
{
"range": {
"price": {
"lt": 800
}
}
}
],
"must_not": [
{
"term": {
"status": "preorder"
}
}
]
}
},
"size": 2,
"_source": [
"name",
"price",
"status",
"in_stock"
]
}Ответ Elasticsearch
{
"hits": {
"total": {
"value": 34,
"relation": "eq"
},
"hits": [
{
"_id": "23",
"_score": 4.8997154,
"_source": {
"name": "Dell Travel Speaker 23",
"price": 100,
"in_stock": true,
"status": "discontinued"
}
},
{
"_id": "53",
"_score": 4.8997154,
"_source": {
"name": "Dell Travel Speaker 53",
"price": 100,
"in_stock": true,
"status": "discontinued"
}
}
]
}
}Как читать результат
Текстовый запрос задаёт взаимный порядок допущенных и не исключённых товаров. Наличие, цена и исключения определяют состав, а не бонус релевантности.
Самопроверка
Сначала ответьте самостоятельно, затем раскройте объяснение.
1. Куда поместить доступ к данным?
В обязательные серверные ограничения до ранжирования.
2. Зачем сжимать продажи логарифмом?
Чтобы огромные значения не подавляли остальные сигналы.
3. Что делает boost_mode?
Как результат функций объединяется с исходным score.
4. Rescore видит все документы?
Нет, только выбранное окно кандидатов на шардах.
5. Как проверить новый коэффициент?
Сравнить метрики и регрессии на размеченном наборе запросов.
Краткая памятка
- В обязательные серверные ограничения до ранжирования.
- Чтобы огромные значения не подавляли остальные сигналы.
- Как результат функций объединяется с исходным score.
- Нет, только выбранное окно кандидатов на шардах.
- Сравнить метрики и регрессии на размеченном наборе запросов.
Официальная документация
Готовы применить знания?
Подтвердите прочтение, чтобы сохранить своё место. Чтение и решение заданий учитываются отдельно в этом браузере с помощью гостевой cookie.