2011-09-20 53 views
0

在我試圖通過相關性返回全文搜索結果時,我沒有得到期望的結果。下面是一個實際的輸出查詢示例:mysql fulltext布爾搜索 - 按相關性排序

SELECT *, 
     ((9 * (MATCH(title) AGAINST ('"apple 8"' IN BOOLEAN MODE))) + 
     (8 * (MATCH(title) AGAINST ('+apple +8' IN BOOLEAN MODE))) + 
     (7 * (MATCH(title) AGAINST ('apple* 8 ' IN BOOLEAN MODE))) + 
     (6 * (MATCH(description) AGAINST ('"apple 8"' IN BOOLEAN MODE))) + 
     (5 * (MATCH(description) AGAINST ('+apple +8 apple* 8 ' IN BOOLEAN MODE)))) as relevance 
FROM items 
WHERE status='1' 
AND ((MATCH(title, description) AGAINST ('"apple 8" +apple +8 apple* 8 ' IN BOOLEAN MODE))) 
ORDER BY cat_featured DESC 
     , relevance DESC 

我敢肯定,這可能是全亂了,但我已經嘗試了不同的設置和繼續得到同樣的結果......在這個例子中,含有「蘋果項目「標題中的」8「被返回55次結果中的第17次,而不是像我希望的那樣是第1次,因爲它是唯一具有標題中兩個術語的結果。我哪裏錯了?

+0

我絕不是專家,但你可能想將你的全文搜索,而不是使用單獨的那些負載。我問了一個問題[這裏](http://stackoverflow.com/questions/5417792/normalise-mysql-fulltext-score),這可能有助於返回每一行的相關性。 – Bojangles

+0

非常感謝您的幫助。不幸的是,你的問題並沒有讓我更清楚......我發現這個東西令人難以置信的混亂!我剛開始時只有兩組比賽(標題爲1,描述爲1),並且獲得了相同的輸出,所以我一直在玩弄它,試圖弄清楚如何操縱結果的順序。第一部分工作(精確匹配首先返回)。我不明白如何得到包含這兩個詞的結果。 – Jen

+0

有很多東西讓我不知所措 - 你並不孤單。不幸的是,MySQL的更高級功能就是其中之一。 – Bojangles

回答

0

(MATCH(xyz) AGAINST('abc'))與任意數字相乘是錯誤的。你不能這樣做,因爲它們不是實際的數字。

更多在這裏閱讀Using MySQL Full-text Searching

0

這是一個基本的例子做類似的事情。希望這可以幫助。

在此之前,您需要在這兩列上創建一個FULLTEXT索引。如果你使用的是phpMyadmin,這很容易。

https://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html

select *, MATCH(title, description) AGAINST("your string here" IN BOOLEAN MODE) AS relevance 
     from items 
     where 
     active = 1 and 
     MATCH(title, description) AGAINST("your string here" IN BOOLEAN MODE) order by relevance desc