Я использую 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. (Тем не менее, до сих пор нет понятия о том, что послужило причиной первоначального сбоя.)