2011-10-03 39 views
1

我正在創建一個使用php和mySQL的在線FAQ類型系統。以下SQL用於根據用戶輸入的內容$term來查找相關問題。mySQL全文學習

當用戶搜索某些內容並點擊相關問題以顯示答案時,他們有機會根據搜索到的內容對給出的問題進行評分。

SQL的第一部分從實際問題表中獲取相關問題ID。第二部分着眼於收視表,並試圖匹配人們以前搜索的內容以查找相關的問題ID。

這些結果的聯合然後用於獲取存儲在數據庫中的實際問題標題。

(SELECT id_question, 
MATCH(question, tags) AGAINST ('%$term%') as rank 
FROM question 
WHERE MATCH(question, tags) AGAINST ('%$term%') 
AND category = '$category') 

UNION 

(SELECT id_question, 
MATCH(customer_search_query) AGAINST ('%$term%') as rank 
FROM rating 
WHERE MATCH(customer_search_query) AGAINST ('%$term%') 
AND (customer_rating = 1)) 
ORDER BY rank DESC LIMIT 5;"); 

我遇到的問題是系統沒有真正學習正確。例如,如果我鍵入「三個用戶」,系統將在問題表中找到一個匹配項。

如果我輸入「3個用戶」,系統將在問題表中找到一個匹配項(基於關鍵字「users」)。如果我點擊「是,這回答了我的問題」,它會在評分表中存儲「3個用戶」,並將其與「三個用戶」的問題相關聯。

問題是「3」只與「三個用戶」關聯。有沒有辦法將本例中的數字3與單詞「three」的每個實例相關聯。

+0

意味着你要給出替換舊字(三級)的所有實例字(3)。我對嗎? – diEcho

回答

1

在自然語言模式下,您不使用通配符match against(默認值)

使用此查詢,而不是:

(SELECT id_question, 
MATCH(question, tags) AGAINST ('$term') as rank 
FROM question 
WHERE MATCH(question, tags) AGAINST ('$term') 
AND category = '$category') 

UNION ALL <<-- faster than UNION. 

(SELECT id_question, 
MATCH(customer_search_query) AGAINST ('$term') as rank 
FROM rating 
WHERE MATCH(customer_search_query) AGAINST ('$term') 
AND (customer_rating = 1)) 
ORDER BY rank DESC LIMIT 5;"); 

可以使用搜索修飾符in boolean mode

也匹配不會搜索短於4個字符的停用詞和單詞。
當您使用$term = "3 users"時,MySQL將僅查找users並忽略3

如果你要搜索3你就必須恢復到LIKE '% 3 %'

參見:
http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html
http://dev.mysql.com/doc/refman/5.0/en/fulltext-stopwords.html