SphinxQL 匹配 MySQL LIKE %searchterm%

SphinxQL match equivalent of MySQL LIKE %searchterm%

在我的 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,结果相同。

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

定义 'words'

ie MATCH('@email johndoe') 仅匹配其中包含 johndoe 的地址作为 word。默认 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')