MySQL - 具有部分单词匹配和相关性分数的高效搜索 (FULLTEXT)

Posted

技术标签:

【中文标题】MySQL - 具有部分单词匹配和相关性分数的高效搜索 (FULLTEXT)【英文标题】:MySQL - Efficient search with partial word match and relevancy score (FULLTEXT) 【发布时间】:2015-04-01 10:09:33 【问题描述】:

如何进行 mysql 搜索,既能匹配部分词,又能提供准确的相关性排序?

SELECT name, MATCH(name) AGAINST ('math*' IN BOOLEAN MODE) AS relevance
FROM subjects
WHERE MATCH(name) AGAINST ('math*' IN BOOLEAN MODE)

布尔模式的问题是相关性总是返回 1,所以结果的排序不是很好。例如,如果我将搜索结果限制为 5,则返回的结果有时似乎不是最相关的。

如果我在自然语言模式下搜索,我的理解是相关性分数很有用,但我无法匹配部分单词。

有没有办法执行满足所有这些条件的查询:

可以匹配部分单词 返回的结果具有准确的相关性 高效

到目前为止我得到的最好的是:

SELECT name
FROM subjects
WHERE name LIKE 'mat%'
UNION ALL
SELECT name
FROM subjects
WHERE name LIKE '%mat%' AND name NOT LIKE 'mat%'

但我不想使用LIKE

【问题讨论】:

一种选择是寻找 mysql 的 FULLTEXT 的替代品,例如 sphinx。 sphinxsearch.com/blog/2014/02/07/use-sphinx-with-mysql 【参考方案1】:

MySQL 5.6 中新的 InnoDB 全文搜索功能在这种情况下有所帮助。 我使用以下查询:

SELECT MATCH(column) AGAINST('(word1* word2*) ("word1 word1")' IN BOOLEAN MODE) score, id, column 
FROM table
having score>0
ORDER BY score 
DESC limit 10;

( ) 将单词组合成一个子表达式。第一组有like word%的意思;第二个寻找确切的短语。分数以浮点数形式返回。

【讨论】:

为什么要搜索 2 个组?两组的比赛是否会产生更高的分数? (好像不是……) 在我的搜索词为我完成之后添加*【参考方案2】:

一年后,我在这个(有点)重复的问题中得到了一个很好的解决方案:

MySQL - How to get search results with accurate relevance

【讨论】:

以上是关于MySQL - 具有部分单词匹配和相关性分数的高效搜索 (FULLTEXT)的主要内容,如果未能解决你的问题,请参考以下文章

BM25算法

经典检索算法:BM25原理

使用相关和随机语料库计算 TF-IDF 单词分数

实现高效的英文单词前缀匹配

实现高效的英文单词前缀匹配

提取仅具有重复字符集2-4次的单词