2011-09-16 114 views
7

我有一個小問題(這就是我希望)與排名的全文搜索,我的搜索結果中的MySQL數據庫。有兩種方式我都試過寫它:全文搜索排名

自然的方式:

SELECT SQL_CALC_FOUND_ROWS *, 
MATCH(productname,keywords) AGAINST('$cl_search') AS score 
FROM products 
WHERE MATCH(productname,keywords) AGAINST('$cl_search') 
ORDER BY score DESC,lastupdated DESC; 

布爾WAY:

SELECT SQL_CALC_FOUND_ROWS *, 
((MATCH(productname) AGAINST('$cl_search' IN BOOLEAN MODE))+ 
(MATCH(keywords) AGAINST('\"$cl_search\"' IN BOOLEAN MODE))) AS score 
FROM products 
WHERE MATCH(productname,keywords) AGAINST('$cl_search') 
ORDER BY score DESC,lastupdated DESC; 

我喜歡索引我得到的,當我在自然語言模式中進行搜索,但我該怎麼辦防止進入即「包包包包包包」有人爲產品名稱,以獲得良好的搜索結果?

所以我寫了布爾方式來解決這個問題,但是1.它比較慢,而且我沒有得到像'比較字數'這樣的其他相關性索引。

關於如何獲得兩全其美的想法?

回答

-3

很簡單,使用Lucene代替它,它更先進,並且可以選擇處理你想要的東西。

1

如何編寫一個用戶定義的函數,這將刪除重複的關鍵字? 那麼你的查詢將如何:

SELECT SQL_CALC_FOUND_ROWS *, 
MATCH(productname,RM_DUP(keywords)) AGAINST('$cl_search') AS score 
FROM products 
    WHERE MATCH(productname,RM_DUP(keywords)) AGAINST('$cl_search') 
    ORDER BY score DESC,lastupdated DESC;