Для поиска в проектах построенных на 1C-Битрикс для поиска можно использовать внешнюю систему полнотекстового поиска Sphinx. Она быстро работает и имеет возможности гибкой конфигурации.
Одна из таких функций - словоформы (wordforms). Словоформы позволяют поиску выдавать одни и те же результаты не зависимо от того какую словоформу пользователь ввел. Например, можно настроить, чтобы слова "жигуль", "лада" и "ваз" приводили к одним и тем же результатам.
И вот тут у многих, судя по вопросам без ответов на просторах интернета, начинаются проблемы. Эти словоформы "не работают". Думаю эта статья поможет решить данную проблему. Я привожу три момента на которые стоит обратить внимание
Как правило, конфигурирование Sphinx начинают c конфига предлагаемого в админке Битрикс и среди прочего в том конфиге есть следующая строка
morphology = stem_enru, soundex
Для настройки словоформ необходимо в этот конфиг добавить подключение файла.
wordforms = /etc/sphinxsearch/wordforms.txt
Название и расположение файла вы можете выбрать самостоятельно - я разместил в каталоге где размещается конфиг файл системы поиска. Так же необходимо предоставить права пользователю от которого работает поиск.
По умолчанию на Debian это "sphinxsearch" на CentOS "sphinx"
soundex - подключает фонетический алгоритм при разборе фразы. Т.е. например слова "hummer" и "hamer" фонетически звучат одинаково и будут этим алгоритмом приведены к единому значению. И вот на этом этапе возникает первая проблема со словоформами.
Добавляем в словоформы (в файл wordforms.txt) форму слова в ожидании, что она будет приводить к тому же результату
хаммер => hummer
Однако это правило не сработает. Все дело в том, что слово hummer преобразуется фонетическим алгоритмом. Для проверки этого подключимся из консоли к Sphinx
mysql -h 127.0.0.1 -P 9306
И в открывшейся SQL консоли введем команду
call keywords('hummer hamer хаммер','bitrix',1);
В команде первый параметр - анализируемая строка, второй: имя индекса как в конфиге, третий (не обязательный) включает вывод двух колонок статистики. В результате этой команды мы получим следующий вывод:
+------+--------------+--------------+------+------+ | qpos | tokenized | normalized | docs | hits | +------+--------------+--------------+------+------+ | 1 | hummer | h560 | 0 | 0 | | 2 | hamer | h560 | 0 | 0 | | 3 | хаммер | hummer | 0 | 0 | +------+--------------+--------------+------+------+
Как видим "hummer" и "hamer" были нормализованы к одному значению и оба слова будут приводить к одному результату поиска, ровно тому, который мы и ожидаем, а вот "хаммер" нормализовался к "hummer" - и уже не будет сопоставлен с теми же результатами. Т.к. "реальный" hummer нормализовался к другому значению.
Так происходит в результате последовательности обработки фраз. Для исправления ситуации необходимо дополнить wordforms.txt
хаммер => hummer hummer => hummer
Теперь результат команды call keywords выглядит так
+------+--------------+------------+------+------+ | qpos | tokenized | normalized | docs | hits | +------+--------------+------------+------+------+ | 1 | hummer | hummer | 0 | 0 | | 2 | hamer | h560 | 0 | 0 | | 3 | хаммер | hummer | 0 | 0 | +------+--------------+------------+------+------+
Как видим осталась проблема со словом "hamer". Для ее решения есть два варианта. Первый это по примеру "хаммер" добавить прямое соответствие, но тогда придется добавлять строчки для каждой формы, которая нам подошла с точки зрения морфологии. Чтобы этого не делать есть второй путь: добавить в начале строки знак тильду - это отменит необходимость перечислять все морфологические формы.
хаммер => hummer ~hummer => hummer
Вот теперь все будет связано воедино и все три слова, введенные в строку запроса, будут приводить к одному и тому же результату.
+------+--------------+------------+------+------+ | qpos | tokenized | normalized | docs | hits | +------+--------------+------------+------+------+ | 1 | hummer | hummer | 0 | 0 | | 2 | hamer | hummer | 0 | 0 | | 3 | хаммер | hummer | 0 | 0 | +------+--------------+------------+------+------+
Как вывод из всего этого: прежде чем добавлять очередную форму посмотрите на то как анализирует Sphinx эту форму и основное слово командой call keywords
Sphinx работает с кодировкой UTF-8. Соответственно и файл wordforms.txt должен быть в этой кодировке.
Для того, чтобы вносимые изменения вступали в силу необходимо не только перезапустить Sphinx. Необходимо остановить службу, удалить файлы индексов. Путь к ним указан в конфигурационном файле системы поиска, а разделе настройки того индекса, с котором работаете в параметре path