我有办法获得全文搜索背后的逻辑
示例表
+----+-------------+
| id | title |
+----+-------------+
| 1 | Hello World |
| 2 | World World |
| 3 | Hello |
| 4 | Hello Hello |
+----+-------------+
这是查询
SELECT `title` FROM `example` WHERE MATCH(`title`) AGAINST('World')
结果
+-------------+
| title |
+-------------+
| World World |
| Hello World |
+-------------+
现在'世界'是第一次,因为它有'世界'两次 有什么方法可以得到像这样的东西
+-------------+------------+-------+
| title | appearance | score |
+-------------+------------+-------+
| World World | 2 | 1 |
| Hello World | 1 | 2 |
+-------------+------------+-------+
答案 0 :(得分:1)
我会尝试使用这样的语法,而不是尝试计算单词出现的次数。
请注意,它使用IN BOOLEAN MODE
表示当+之前,它必须发生。 https://dev.mysql.com/doc/refman/5.6/en/fulltext-boolean.html
SELECT Title, MATCH(`title`) AGAINST ('+World +World' IN BOOLEAN MODE) AS Score
FROM `example`
WHERE MATCH(`title`) AGAINST ('+World +World' IN BOOLEAN MODE)
ORDER BY Score DESC
它将生成相关分数,您稍后可以对其进行排序。
如果你需要计算,这就可以了。
SELECT Title,
ROUND (
(CHAR_LENGTH(`title`) - CHAR_LENGTH(REPLACE(`title`, "World", ""))) / CHAR_LENGTH("World")
) AS appearance
FROM `example`
WHERE MATCH(`title`) AGAINST ('World')
请注意,它区分大小写,因此可以将title
与LCASE