MySQL-具有部分单词匹配和相关性得分的高效搜索(全文)
如何进行MySQL搜索,既能匹配部分单词,又能提供准确的相关性排序MySQL-具有部分单词匹配和相关性得分的高效搜索(全文),mysql,search,full-text-search,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, 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%'
但是我不希望像使用那样使用
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;
其中()
将单词分组到子表达式中。第一组有类似单词%
的意思;第二种方法寻找确切的短语。分数以浮动的形式返回。一年后,我在这个(有些)重复的问题中得到了一个很好的解决方案:
一个选择是寻找mysql全文的替代品,比如sphinx。为什么要搜索两个组?两组的比赛都能得到更高的分数吗?(似乎不是…)在我的搜索词之后添加*
,这对我有帮助。