Например если в каждом сообщении на форуме встречается слово "привет", то поиск по этому слову выдаст все сообщения, что не может удовлетворить инициатора такого запроса.
Такие слова называются "СТОП" словами. Но не потому, что сервер от таких запросов останавливается .
Возникает пара вопросов:
- Как определить какие слова являются наиболее "популярными"?
- Как исключить их из полнотекстового индекса?
[spoiler]
Ответ на первый:
Идем в Настройки - Инструменты - SQL запрос (/bitrix/admin/sql.php?lang=ru&del_query=Y)
И составляем ТОП сто самых популярных терминов на сайте:
select STEM,count(*) from b_search_content_stem group by STEM order by count(*) desc limit 100 |
Внимание: этот запрос может быть очень "тяжелым". Не торопитесь и выполните его во время наименьшей нагрузки на сайт.
А если вдруг есть актуальная резервная копия не на удаленном сайте, то лучше выполнить его на ней.
Как вариант можно создать страницу со следующим содержимым:
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $query = $DB->Query("select STEM,count(*) from b_search_content_stem group by STEM order by count(*) desc limit 100"); while($ar = $query->Fetch()) echo " ,",$ar["STEM"]; require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); ?> |
Это позволит быстро скопипастить список самых популярных слов.
Обязательно удалите эту страницу после ее выполнения!
Вооружившись таким знанием, приступим к решению второго вопроса.
Сначала надо обновить версию модуля поиска до 6.0.1.
Начиная с этой версии появилась поддержка константы STEMMING_STOP_RU.
Это список слов (разделенных запятыми) которые не будут заноситься в полнотекстовый индекс, а также будут "исключаться" из поисковых запросов.
В init.php пишем:
define("STEMMING_STOP_RU", "ЗДЕСЬ, СПИСОК, СТОП, СЛОВ"); |
И теперь наиболее сложная часть: нужно выполнить полную переиндексацию.
Здесь могу обратить внимание на несколько моментов выстраданных из личного опыта.
1. Наиболее эффективным будет удаление/установка модуля поиска без сохранения таблиц.
2. Начиная с версии форума 5.9.3 у модуля появилась настройка значительно ускоряющая переиндексацию (Количество документов, переиндексируемых за шаг). Разумное значение 2-3 тысячи.
3. По окончании переиндексации жизненно необходимо выполнить analyze на таблицах b_search_*
Практика показывает, что размер индекса уменьшается примерно на 10-15%.
И возможный прирост скорости поиска в десятки раз (20-50).
а почему STEMMING_STOP_RU указывается константой в скрипте?
было бы гораздо удобней управлять этой переменной из настроек поиска.
у меня, например, редакторы и модераторы не имеют доступ на запись файлов - значит за такой мелочью будут обращаться к администратору
это ведь принципиально, да?
хотя, разница есть: лишний раз открывать шелл (или грузить четырсеста кило вашего "визуального" редактора) <- против -> установить строку в бд из админ-интерфейса (со включенным сжатием примерно 15-25 КБ)
Да, а какое количество стоп-слов имеет смысл добавлять в переменную? 10...20...100?
Есть рекоменлдации?
На данный момент БУС поддерживает стемминг 2-х языков русского и английского.
Для первого обрабатывается константа STEMMING_STOP_RU, для второго - STEMMING_STOP_EN.
Так же поддерживается механизм подключаемых пользовательских алгоритмов.
Подробнее читайте в помощи для разработчиков.