2012-04-06 60 views
6

當我嘗試在布爾模式下利用全文搜索設置搜索時,我感到有點困惑。下面是我使用的查詢:MySQL全文搜索布爾模式混淆

$query = "SELECT *, 

     MATCH(title) AGAINST('$q' IN BOOLEAN MODE) AS score 

     FROM results 

     WHERE MATCH(title) AGAINST('$q' IN BOOLEAN MODE) 

     ORDER BY score DESC"; 

當我運行+divorce+refinance搜索,返回的結果是:

1) Divorce: Paying Off Spouse = Rate/Term Refinance 
2) Divorce - What to Look Out For Regarding Divorced Borrowers 

難道我就在想,第二個結果不應該出現的,因爲它沒有兩個詞?如果不是,我該如何創建該功能?

回答

9

也許我錯了,但如果你搜索這個字符串+divorce+refinance你會得到一個奇怪的結果。如果你想搜索這兩個單詞,你應該搜索+divorce +refinance(之間有一個空格)。

我測試,它僅返回一行:

Divorce: Paying Off Spouse = Rate/Term Refinance 
4

你的問題涉及到創建一個優先布爾查詢,併爲這種類型的查詢一個有去的布爾搜索的深度和現在怎麼樣執行布爾搜索。簡而言之,讓我解釋爲什麼顯示結果的第二個數字結果。

一旦首先應該理解布爾在編程中意味着什麼? 這意味着要麼條件是真或假i,e 0到1.

現在讓我解釋爲布爾搜索執行?你已經給了兩個字。讓我們在布爾模式下逐行搜索。搜索引擎現在開始並逐行搜索發現第一個單詞的地方,這會使記錄爲真,並將找到的第一個單詞的行的分數設爲1,並準備在該行中找到的單詞數。

現在移動下一個單詞,做同樣的過程給記錄真何字被發現,也準備在該行中找到的單詞的數量,使記錄列表。

現在有結果的兩排都可以和他們在一起,隨該優先考慮的話與話的最大數量和行這裏是主要問題所在。

首先>>>總NOS。 >>第二>>總數。 >>>最終>>行
字>>>結果>>字>>>>字>>>結果>> >>沒有回答


1 >>>>>>>> 2 >>>>>>>> 1 >>>>>>>>> 1 >>>>>>>> 1.33 >>>> 1 >>> 1.33
0 >>>>>>>> 0> >>>>>>> 2 >>>>>>>>> 2 >>>>>>>> 1.25 >>>> 2 >>> 1.25
0 >>>>>>>> 0 >> >>>>>> 1 >>>>>>>>> 0 >>>>>>>> 1.25 >>>> 3 >>> 1

雖然泡吧兩個結果列表真正添加如果你輸入1 + 0 = 1,那麼結果是真的d與值大於1那麼多,而進球的相關性的話發現它總是發現,搜索引擎顯示的地方找到任何單詞的結果。

得分相關性查詢有兩種類型,既可以忽略等於一的分數,也可以只對計分大於1的記錄進行計算。其次是做出這樣一種查詢,它從不顯示記錄等於一。至於你的情況,你可以讓下面的東西也得到正確的結果爲兩個詞:

SELECT *, ((1.3 * (MATCH(title) AGAINST ('+term +term2' IN BOOLEAN MODE))) + (0.6 * (MATCH(text) AGAINST ('+term +term2' IN BOOLEAN MODE)))) AS score FROM results WHERE (MATCH(title, text) AGAINST ('+term +term2' IN BOOLEAN MODE)) HAVING relevance > 0 ORDER BY relevance DESC; 

我知道用這個詞HAVING使查詢有點慢,但有沒有其他可用的解決方案。希望這可以解決您的問題。