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

Bad*_*sie 16 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)
Run Code Online (Sandbox Code Playgroud)

布尔模式的问题是相关性总是返回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%'
Run Code Online (Sandbox Code Playgroud)

但我宁愿不使用LIKE.

小智 7

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;
Run Code Online (Sandbox Code Playgroud)

( )单词组合成子表达式.第一组like word%有意义; 第二个寻找确切的短语.得分以浮动形式返回.

  • 为什么要搜索2个群组?两组的比赛都会产生更高的分数吗?(似乎不是...) (2认同)
  • 在我的搜索词后添加“*”对我来说是这样。 (2认同)

Bad*_*sie 6

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

MySQL - 如何获得具有准确相关性的搜索结果