Статус партнерства с 1С-Битрикс: Бизнес партнер
  • Маркетплейс
  • Документация
  • Блог
  • Новости
  • Софт
  • Профиль
  • Настройка: Sphinx как решить проблему с неработающим wordforms

    08.12.2021

    Для поиска в проектах построенных на 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

    Все записи

    © 2001-2022 Воробьев Александр