使用非ASCII字符的Sphinx搜索

使用非ASCII字符的Sphinx搜索,sphinx,thinking-sphinx,Sphinx,Thinking Sphinx,我使用Sphinx 3.1.1(通过ThinkingSphinx 4.4.1)和实时索引(即,它们不直接由MySQL表备份) 在我的开发机器上,我可以成功地搜索带有ASCII和非ASCII(重音UTF-8)字符的字符串 staging机器上部署了相同的Sphinx版本,我在这两个机器上使用完全相同的配置 但是,在登台计算机上,只有当搜索字符串中的所有字符都是ASCII字符时,我的搜索才会返回值。(在本例中,Sphinx似乎返回正确的记录。)当搜索字符串包含重音字符时,Sphinx返回一个空集。(

我使用Sphinx 3.1.1(通过ThinkingSphinx 4.4.1)和实时索引(即,它们不直接由MySQL表备份)

在我的开发机器上,我可以成功地搜索带有ASCII和非ASCII(重音UTF-8)字符的字符串

staging机器上部署了相同的Sphinx版本,我在这两个机器上使用完全相同的配置

但是,在登台计算机上,只有当搜索字符串中的所有字符都是ASCII字符时,我的搜索才会返回值。(在本例中,Sphinx似乎返回正确的记录。)当搜索字符串包含重音字符时,Sphinx返回一个空集。(我可以确认我要查找的记录确实存在。)

我在两台计算机上重建了索引,但没有任何更改。我的理解是Sphinx的3.x版本是基于UTF-8的(但这并不重要,因为这两台计算机运行的是相同的版本)

哪里会出错

注:我可以提供配置,如果它们有帮助,但它们在两台计算机上是相同的,因此我认为它们与问题无关


更新:

我一直能够使它始终不起作用:)。在我的机器上,如果Sphinx在docker图像中运行,它可以处理英文字母,但不能处理非(小写)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)
到目前为止还不错。注意“gibberish”和“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)
看来我应该以某种方式说服斯芬克斯公正对待所有UTF8字符

基于这些,您能否提供解决方案或提示


更新2:manticore(最新docker图片)也发生了同样的事情。所以它看起来像是我配置中的东西,而不是Sphinx/Manticore中的东西



更新3:我可以使用docker和@manticore Search的提示(即,将
charset\u table=non\u cjk
添加到索引中)使它与manticore的各种字符一起工作。我会在一天内把所有的东西移到另一台机器上,看看会发生什么。因为它主要是在一个容器里,我很乐观。(不过,对于最初的打嗝原因,仍然没有任何线索。)

嗨。如果你可以复制它与Manticore搜索,我们会很高兴地修复它,如果它是一个错误。我们添加了charset_table=non_cjk,特别是针对像您这样的案例。谢谢@Manticore Search。我会进一步研究,如果我不能让它工作,我可能会尝试Manticore(虽然我的数据集距离大数据有光年,而且由于这是一个小项目,我对资源有些限制)。当使用Thinking Sphinx时,Manticore可以作为Sphinx的替代品(二进制文件有相同的名称),所以它应该是相当无痛的。至于你的问题:我有点不知道原因是什么,因为你在两台机器上都有相同的设置。我想您已经运行了
rake ts:rebuild
,以确保重新创建索引数据文件,只是为了再次检查?我也不知所措。我会再检查一遍,然后再给你回复。我想知道这里是否有一些区域设置(可能是操作系统的一级?)?(我的机器和另一台机器很可能不同。)另外:我之前试过,但最终退出了。我不太记得确切的原因,但要么是这样,要么是因为我没有意识到它有一个实时模式(并且无法使delta对我起作用——很可能是我的不好;但无论如何)。所以可能我之前也看到过这个问题(虽然是在相同的两台机器上)。花了一些时间,但我更新了问题,对一个故障案例进行了更详细的分析。(我可以让它在我的开发机器上失败。但是,我现在不能让它不失败:/)