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)的主要内容,如果未能解决你的问题,请参考以下文章