在我的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_ANY
和SPH_MATCH_EXTENDED
,结果相同。
答案 0 :(得分:1)
我怀疑这主要是由于整个单词匹配。 Sphinx匹配整个单词。 根据charset_table http://sphinxsearch.com/docs/current/conf-charset-table.html
定义了“单词” ie MATCH('@email johndoe')
仅匹配其中带有johndoe
作为单词的地址。默认的charset_table将.
-
和@
(在电子邮件中很常见!)都保留为分隔符,因此可以匹配johndoe@domain.com
或email@johndoe.com
,但不是email@myjohndoe.com
,索引的单词是myjohndoe
而不是johndoe
而mysql'LIKE'将很高兴匹配部分单词。例如email like '%johndoe%'
将是johndoesmith@domain.com
,johndoes555@domain.com
和555@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')