SphinxQL与MySQL LIKE%searchterm%的匹配项

时间:2018-10-03 14:17:07

标签: sphinx

在我的MySQL数据库中,我得到查询数据的结果:

mysql> select count(*) from emails where email like '%johndoe%';
+----------+
| count(*) |
+----------+
|      102 |
+----------+
1 row in set (15.50 sec)

我的数据在Sphinx(实际上是Manticore Search)下用min_word_len = 1进行了索引。现在,当我使用SphinxQL搜索时,只会得到部分结果:

mysql> SELECT count(*) FROM search1 WHERE MATCH('@email johndoe') LIMIT 1000 OPTION max_matches=1000;
+----------+
| count(*) |
+----------+
|       16 |
+----------+
1 row in set (0.00 sec)

有人知道如何匹配MySQL给我的结果吗?我用sphinxapi尝试了SPH_MATCH_ANYSPH_MATCH_EXTENDED,结果相同。

1 个答案:

答案 0 :(得分:1)

我怀疑这主要是由于整个单词匹配。 Sphinx匹配整个单词。 根据charset_table http://sphinxsearch.com/docs/current/conf-charset-table.html

定义了“单词”

ie MATCH('@email johndoe')仅匹配其中带有johndoe作为单词的地址。默认的charset_table将. -@(在电子邮件中很常见!)都保留为分隔符,因此可以匹配johndoe@domain.comemail@johndoe.com,但不是email@myjohndoe.com,索引的单词是myjohndoe而不是johndoe

而mysql'LIKE'将很高兴匹配部分单词。例如email like '%johndoe%'将是johndoesmith@domain.comjohndoes555@domain.com555@johndoes.com等。它是纯子串匹配。


简而言之,可能需要调整charset_table. -@都可以是字字符,因此电子邮件将是整个字。


或者,

可能仅启用与min_infix_len的部分单词匹配。 http://sphinxsearch.com/docs/current.html#conf-min-infix-len

然后可以执行MATCH('@email *johndoe*'),它将获得更接近的结果。


min_infix_len互补的

将是expand_keywords http://sphinxsearch.com/docs/current.html#conf-expand-keywords

然后*通配符将被自动添加,因此可以返回到MATCH('@email johndoe')