2015-06-15 25 views
1

我有沒有辦法得到一個完整的文本搜索背後的邏輯MySQL的全文搜索計數OCCURENCES

例表

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

我會嘗試使用語法這個樣子,而不是嘗試計算這個詞出現的次數。

請注意,它使用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

+0

確定,這給了我的成績,但我怎麼能得到出場的次數? –

+0

我編輯了答案。 –

+0

我喜歡這個想法,只有一個問題,這隻適用於單詞搜索。 –