Перейти к содержимому

Релевантность выдачи - правила сортировки, стоп-слова, вес

Управляем порядком результатов поиска по сайту: правила сортировки и вес документов, стоп-слова, режим быстрого поиска и проверка выдачи по контрольным запросам.

Что нужно знать заранее

Порядок результатов считает сам индекс, а не компонент вывода. На ранг влияют наличие слов запроса, расстояние между ними и дата изменения документа.

Поверх этого расчёта работают правила сортировки: они дают документу свой фиксированный вес. Так поднимают карточки услуг, посадочные страницы и разделы, которые обязаны быть первыми по коммерческим запросам.

Любая правка настроек ранжирования вступает в силу далеко не сразу после сохранения. Пока индекс ранжирования не обновлён, выдача остаётся прежней, и правки выглядят бесполезными.

Шаги

  1. Записать список контрольных запросов и текущую выдачу по каждому из них в файл.
  2. Задать правила сортировки нужным документам и обновить после этого весь поисковый индекс.
  3. Вынести самые частые слова в список стоп-слов и затем переиндексировать сайт целиком.
  4. Решить, включать ли быстрый поиск, взвесив скорость ответа против качества самой выдачи.
  5. Прогнать контрольные запросы заново и сравнить порядок результатов с прежней выдачей построчно.

Решение

Смотрим текущую выдачу и ранг документов:

\Bitrix\Main\Loader::includeModule('search');
$res = CSearch::Search(['QUERY' => 'доставка', 'SITE_ID' => SITE_ID]);
while ($row = $res->Fetch()) {
printf("%5s %-50s %s\n", $row['RANK'] ?? '-', mb_substr($row['TITLE'], 0, 50), $row['URL']);
}
// ранг считает индекс: компонент выдачи только показывает готовый порядок

Печать выдачи из кода избавляет от споров о том, «что показывает поиск». Список с рангами сразу показывает, какие документы конкурируют за верхние строки по конкретному запросу.

Выносим частые слова в стоп-слова:

/local/php_interface/init.php
define('STEMMING_STOP_RU', 'КАК, ГДЕ, КУПИТЬ, ЦЕНА, ОТЗЫВЫ');
define('STEMMING_STOP_EN', 'THE, AND, FOR');
// стоп-слова уменьшают индекс и заметно ускоряют поиск на крупном сайте

Стоп-слова подбирают по статистике запросов, а не наугад. Слово, которое стоит почти в каждом документе, ранг не различает и лишь раздувает поисковый индекс.

Обновляем индекс после правок:

$res = CSearch::ReIndexAll(false, 30, ['MODULE_ID' => 'iblock']);
printf("проиндексировано за шаг: %s\n", is_array($res) ? count($res) : $res);
// переиндексация идёт шагами: полный проход крупного каталога занимает часы
// правила сортировки применяются только после обновления индекса ранжирования

Проверяем выдачу по контрольным запросам:

foreach (['доставка', 'возврат товара', 'оплата картой', 'самовывоз'] as $query) {
$res = CSearch::Search(['QUERY' => $query, 'SITE_ID' => SITE_ID]);
$first = $res->Fetch();
printf("%-20s -> %s\n", $query, $first ? $first['TITLE'] : 'ничего не найдено');
}
// такой прогон занимает секунды и ловит поломку выдачи раньше посетителей

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

Собираем кандидатов в стоп-слова из статистики:

$res = CSearchStatistic::GetList(['CNT' => 'DESC'], ['>CNT' => 10], ['PHRASE', 'CNT', 'CNT_RESULT']);
while ($row = $res->Fetch()) { printf("%-30s %s запросов\n", $row['PHRASE'], $row['CNT']); }
// частые запросы показывают и слова-паразиты, и настоящие пробелы каталога

Типичные проблемы

Правила сортировки заданы, а порядок прежний.

Индекс ранжирования не обновлён после правки правил сортировки документов. Обновление индекса запускают из настроек модуля поиска сразу после изменения любых правил.

После включения быстрого поиска выдача стала хуже.

Режим быстрого поиска ускоряет ответ ценой качества ранжирования по сложным длинным запросам. Его включают осознанно, а для витрины с длинными фразами оставляют обычный поиск.

Стоп-слова добавили, а индекс не уменьшился.

Не выполнена полная переиндексация: старые записи индекса продолжают хранить эти частые слова. После правки списка стоп-слов сайт переиндексируют целиком, а не отдельными разделами.

Нужная страница вообще не участвует в ранжировании.

У статической страницы нет заголовка, и её документ проиндексирован платформой совсем некорректно. Заголовок статической страницы задают вызовом платформы либо метатегом в её коде.

Порядок результатов меняется от запроса к запросу.

В ранжировании участвует дата изменения, а обмен обновляет документы сразу большими пачками. Для стабильных верхних строк нужным документам задают фиксированный вес правилами сортировки.

Частые вопросы

Как поднять конкретную страницу в выдаче?

Правилом сортировки с фиксированным весом для этого документа. После правки правил обязательно обновляют индекс ранжирования, иначе порядок не изменится.

Сколько стоп-слов имеет смысл задавать?

Десятки, а не сотни: убирают только слова, которые встречаются почти в каждом документе. Кандидатов берут из статистики запросов и содержимого сайта.

Включать ли быстрый поиск?

На крупном сайте с простыми запросами - да, на витрине с длинными фразами - осторожно. Он ускоряет ответ, но ухудшает ранжирование по сложным запросам.

Почему после обмена выдача перестроилась?

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

Как проверять поиск после правок?

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

Смежное

Первоисточник