Inkognitoss
@Inkognitoss
Full-stack разработчик.

Почему могут не работать wordforms Sphinx на RealTime индексах?

Начал с малого, открыл официальную статью о wordforms и создал индекс ровно как показано в примере:
https://sphinxsearch.com/blog/2014/12/04/how-to-us...
Мой конфиг стал таким:
indexer
{
        mem_limit               = 128M
}


searchd
{
        listen                  = 9312
        listen                  = 9306:mysql41
        log                     = /var/log/sphinx/searchd.log
        query_log               = /var/log/sphinx/query.log
        read_timeout            = 5
        max_children            = 30
        pid_file                = /var/run/sphinx/searchd.pid
        seamless_rotate         = 1
        preopen_indexes         = 1
        unlink_old              = 1
        workers                 = threads # for RT to work
        binlog_path             = /var/lib/sphinx/
}
source tsv_test
{
        type                            = tsvpipe
        tsvpipe_command                 = cat sample.tsv
        tsvpipe_field_string            = title

}

index tsv_test
{
        source          = tsv_test
        path            = /var/lib/sphinx/tsv_test
        wordforms = syns.txt
}


После этого успешно могу подключиться к в mysql командой:
mysql -h0 -P9306
и запросить
select * from tsv_test where match('c2d');
получить
+------+------------+
| id   | title      |
+------+------------+
|    1 | Core 2 Duo |
+------+------------+
1 row in set (0.00 sec)

Отлично, подумал я, всё работает, попробую подключить wordforms к реалтайм индексу. Создал реалтайм индекс согласно инструкции sphinxsearch.com/docs/current/rt-overview.html и конфиг стал таким:

indexer
{
        mem_limit               = 128M
}


searchd
{
        listen                  = 9312
        listen                  = 9306:mysql41
        log                     = /var/log/sphinx/searchd.log
        query_log               = /var/log/sphinx/query.log
        read_timeout            = 5
        max_children            = 30
        pid_file                = /var/run/sphinx/searchd.pid
        seamless_rotate         = 1
        preopen_indexes         = 1
        unlink_old              = 1
        workers                 = threads # for RT to work
        binlog_path             = /var/lib/sphinx/
}
source tsv_test
{
        type                            = tsvpipe
        tsvpipe_command                 = cat sample.tsv
        tsvpipe_field_string            = title

}

index tsv_test
{
        source          = tsv_test
        path            = /var/lib/sphinx/tsv_test
        wordforms = syns.txt
}

index rt
{
        type = rt
        path = /var/lib/sphinx/rt
        rt_field = title
        rt_field = content
        rt_attr_uint = gid
        wordforms = syns.txt
}

Подключаюсь к MySQL вношу запись
INSERT INTO rt VALUES ( 1, 'Core 2 Duo', 'Core 2 Duo' , 5);

Проверяю:

mysql> SELECT * FROM rt WHERE MATCH('Core 2 Duo');
+------+------+
| id   | gid  |
+------+------+
|    1 |    5 |
+------+------+
1 row in set (0.00 sec)

Делаю похожий же запрос рассчитывая что отработает синоним
mysql> SELECT * FROM rt WHERE MATCH('c2d');
И ничего не получаю
Empty set (0.00 sec)
Я уверен что дело не в syns.txt однако приведу его ниже:
c2d > Core 2 Duo
e6600 > Core 2 Duo
core 2duo > Core 2 Duo


Можете кто-нибудь мне помочь. Я и в документации ничего такого пока не нашел.
Хотя молва говорит, что всё должно работать.
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
Inkognitoss
@Inkognitoss Автор вопроса
Full-stack разработчик.
Мне помогла эта статья:
chakrygin.ru/2013/07/sphinx-search.html

А именно это:

Опция «wordforms»
Опция wordforms задаёт путь к пользовательскому файлу словоформ, который имеет два основных назначения.

Во-первых, этот файл может быть использован, чтобы указать правильную нормализованную форму слова в тех случаях, когда стеммер делает это неправильно. Например, если необходимо указать, что слово «девушек» всё таки является словоформой от слова «девушка», то в файл словоформ можно дорбавить следующую строку:

девушек => девушк

Обратите внимание, что при использовании стеммера после знака => должна идти именно основа слова («девушк», а не «девушка»), т.к. именно по основе слова впоследствии будет производится поиск. Также обратите внимание, что если вы используете индекс в кодировке utf-8, то файл словоформ тоже обязательно должен быть сохранён в этой же кодировке.

В результате слова «девушка» и «девушек» станут приводиться к одной основе «девушк» и будут считаться одинаковыми при поиске.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ManticoreSearch
@ManticoreSearch
Скорее всего вы сперва создали RT индекс, а затем уже прописали wordforms. В этом случае вы должны сейчас видеть такое:
mysql> show index rt settings;
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| settings      | charset_type = utf-8
 |
+---------------+-----------------------+
1 row in set (0.00 sec)


Если так и есть, то вот это должно помочь:
alter table rt reconfigure

После этого статус должен быть таким:
mysql> show index rt settings;
+---------------+--------------------------------------------+
| Variable_name | Value                                      |
+---------------+--------------------------------------------+
| settings      | charset_type = utf-8
wordforms = syns.txt
 |
+---------------+--------------------------------------------+
1 row in set (0.00 sec)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Studio Mango Краснодар
от 80 000 до 150 000 руб.
TopHit.ru Москва
от 80 000 до 100 000 руб.
ГК «Геоскан» Санкт-Петербург
от 130 000 до 150 000 руб.