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


Можете кто-нибудь мне помочь. Я и в документации ничего такого пока не нашел.
Хотя молва говорит, что всё должно работать.
  • Вопрос задан
  • 455 просмотров
Решения вопроса 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)
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы