使用非ASCII字符的Sphinx搜索
我使用Sphinx 3.1.1(通过ThinkingSphinx 4.4.1)和实时索引(即,它们不直接由MySQL表备份) 在我的开发机器上,我可以成功地搜索带有ASCII和非ASCII(重音UTF-8)字符的字符串 staging机器上部署了相同的Sphinx版本,我在这两个机器上使用完全相同的配置 但是,在登台计算机上,只有当搜索字符串中的所有字符都是ASCII字符时,我的搜索才会返回值。(在本例中,Sphinx似乎返回正确的记录。)当搜索字符串包含重音字符时,Sphinx返回一个空集。(我可以确认我要查找的记录确实存在。) 我在两台计算机上重建了索引,但没有任何更改。我的理解是Sphinx的3.x版本是基于UTF-8的(但这并不重要,因为这两台计算机运行的是相同的版本) 哪里会出错 注:我可以提供配置,如果它们有帮助,但它们在两台计算机上是相同的,因此我认为它们与问题无关使用非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在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对我起作用——很可能是我的不好;但无论如何)。所以可能我之前也看到过这个问题(虽然是在相同的两台机器上)。花了一些时间,但我更新了问题,对一个故障案例进行了更详细的分析。(我可以让它在我的开发机器上失败。但是,我现在不能让它不失败:/)