Поиск сфинкса с не-ASCII символами - PullRequest
0 голосов
/ 01 марта 2020

Я использую Sphinx 3.1.1 (через ThinkingSphinx 4.4.1) с индексами в реальном времени (то есть они не поддерживаются непосредственно MySQL таблицами).

На моей машине разработки я могу успешно выполнить поиск строк с символами ASCII и не-ASCII (с ударением в UTF-8).

Одна и та же версия Sphinx развернута на промежуточной машине, и я использую одинаковую конфигурацию на обоих.

Однако на промежуточной машине мои поиски возвращают значения только в том случае, если все символы в строке поиска являются символами ASCII. (Похоже, что Sphinx возвращает правильные записи в этом случае.) Если строка поиска содержит символы с акцентом, Sphinx возвращает пустой набор. (Я могу подтвердить, что искомая запись существует.)

Я перестроил индексы на обоих компьютерах, но ничего не изменилось. Насколько я понимаю, версия Sphinx 3.x основана на UTF-8 (но это не должно иметь никакого значения, поскольку на двух компьютерах установлены идентичные версии).

Где это может go неправильно?

Примечание: я могу предоставить конфиги, если они помогают, но они идентичны на обоих компьютерах, и поэтому я думаю, что они не имеют отношения к проблеме.


Обновление:

Я был в состоянии заставить это последовательно не работать :). На моей машине, если Sphinx запускается в образе docker, он работает с буквами Engli sh, но не работает с символами (не младшими) -ASCII.

Более конкретно, кажется, что он обрабатывает эти символы как разделители слов.

Запись в таблице Сфинкса:

mysql> select * from project_core WHERE id=22;
+------+----------------+-----------+--------------------+-----------------------+-------------------------------------------+
| id   | sphinx_deleted | tenant_id | sphinx_internal_id | sphinx_internal_class | name_sort                                 |
+------+----------------+-----------+--------------------+-----------------------+-------------------------------------------+
|   22 |              0 |         1 |                 11 | Project               | Example with gibberishßcharsöąůaround     |
+------+----------------+-----------+--------------------+-----------------------+-------------------------------------------+
1 row in set (0.00 sec)

Пока все хорошо. Обратите внимание на 'ß' между 'gibberi sh' и 'chars'. Сейчас:

mysql> select * from project_core WHERE id=22 AND MATCH('*ibber*');
+------+----------------+-----------+--------------------+-----------------------+-------------------------------------------+
| id   | sphinx_deleted | tenant_id | sphinx_internal_id | sphinx_internal_class | name_sort                                 |
+------+----------------+-----------+--------------------+-----------------------+-------------------------------------------+
|   22 |              0 |         1 |                 11 | Project               | Example with gibberishßcharsöąůaround     |
+------+----------------+-----------+--------------------+-----------------------+-------------------------------------------+
1 row in set (0.00 sec)

Все еще счастлив. Но потом:

mysql> select * from project_core WHERE id=22 AND MATCH('*shßch*');
Empty set, 1 warning (0.00 sec)

О-о-о ...

mysql> SHOW META;
+---------------+---------------------------------------------------------------+
| Variable_name | Value                                                         |
+---------------+---------------------------------------------------------------+
| warning       | Query word length is less than min infix length. word: 'ch*'  |
| total         | 0                                                             |
| total_found   | 0                                                             |
| time          | 0.000                                                         |
| keyword[0]    | *sh                                                           |
| docs[0]       | 0                                                             |
| hits[0]       | 0                                                             |
| keyword[1]    | ch*                                                           |
| docs[1]       | 0                                                             |
| hits[1]       | 0                                                             |
+---------------+---------------------------------------------------------------+
10 rows in set (0.00 sec)

Таким образом, кажется, что строка разбита на 'ß'. Если строка с обеих сторон специального символа достаточно длинная, Sphinx возвращает запись очень хорошо:

mysql> select * from project_core WHERE id=22 AND MATCH('*gibberishßchar*');
+------+----------------+-----------+--------------------+-----------------------+-------------------------------------------+
| id   | sphinx_deleted | tenant_id | sphinx_internal_id | sphinx_internal_class | name_sort                                 |
+------+----------------+-----------+--------------------+-----------------------+-------------------------------------------+
|   22 |              0 |         1 |                 11 | Project               | Example with gibberishßcharsöąůaround     |
+------+----------------+-----------+--------------------+-----------------------+-------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW META;
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| total         | 1          |
| total_found   | 1          |
| time          | 0.000      |
| keyword[0]    | *gibberish |
| docs[0]       | 2          |
| hits[0]       | 2          |
| keyword[1]    | char*      |
| docs[1]       | 2          |
| hits[1]       | 2          |
+---------------+------------+
9 rows in set (0.00 sec)

Так что, похоже, мне следует как-то убедить Sphinx отнести справедливость ко всем символам UTF8.

Исходя из этого, можете ли вы предоставить решение или подсказки?


Обновление 2: То же самое происходит с manticore (последнее docker изображение). Таким образом, это похоже на что-то в моем конфиге, а не на Sphinx / Manticore.


Обновление 3: я могу заставить его работать со всеми типами символов с помощью мантикора, используя docker и подсказку от @Manticore Поиск (т.е. добавление charset_table = non_cjk к индексу). Я перенесу весь материал на другую машину примерно через день и посмотрю, что произойдет. Поскольку это в основном в контейнере, я оптимист c. (Тем не менее, до сих пор нет понятия о том, что послужило причиной первоначального сбоя.)

...