【问题标题】:SphinxQL match equivalent of MySQL LIKE %searchterm%SphinxQL 匹配相当于 MySQL LIKE %searchterm%
【发布时间】:2018-10-03 14:17:06
【问题描述】:

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

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

我的数据在 Sphinx 下(实际上是 Manticore 搜索)索引为 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 manticore-search


    【解决方案1】:

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

    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')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2013-05-18
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多