MySQL FULLTEXT搜索计数出现

时间:2015-06-15 10:32:17

标签: mysql full-text-search

我有办法获得全文搜索背后的逻辑

示例表

+----+-------------+
| 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     |
+-------------+------------+-------+

1 个答案:

答案 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')

请注意,它区分大小写,因此可以将titleLCASE

包裹在一起