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

时间:2015-02-02 12:49:33

标签: mysql search full-text-search

如何进行与部分单词匹配的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

2 个答案:

答案 0 :(得分:6)

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%含义;第二个寻找确切的短语。得分以浮动形式返回。

答案 1 :(得分:3)

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

MySQL - How to get search results with accurate relevance