MySQL - 使用部分单词匹配和相关性分数(全文)进行高效搜索
MySQL - Efficient search with partial word match and relevancy score (FULLTEXT)
如何进行 MySQL 搜索,既能匹配部分单词又能提供准确的相关性排序?
SELECT name, MATCH(name) AGAINST ('math*' IN BOOLEAN MODE) AS relevance
FROM subjects
WHERE MATCH(name) AGAINST ('math*' IN BOOLEAN MODE)
布尔模式的问题是相关性总是 returns 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 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%
的意思;第二个寻找确切的短语。分数以浮点数形式返回。
一年后我在这个(有点)重复的问题上得到了一个很好的解决方案:
如何进行 MySQL 搜索,既能匹配部分单词又能提供准确的相关性排序?
SELECT name, MATCH(name) AGAINST ('math*' IN BOOLEAN MODE) AS relevance
FROM subjects
WHERE MATCH(name) AGAINST ('math*' IN BOOLEAN MODE)
布尔模式的问题是相关性总是 returns 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 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%
的意思;第二个寻找确切的短语。分数以浮点数形式返回。
一年后我在这个(有点)重复的问题上得到了一个很好的解决方案: