2011-03-28 182 views
3

我有有列一個表調用對象:爲每個對象SQL搜索結果排名

object_id, 
name_english(vchar), 
name_japanese(vchar), 
name_french(vchar), 
object_description 

當用戶進行搜索時,他們可能進入任一英語,日語或法語...和我的SQL語句是:

SELECT 
o.object_id, 
o.name_english, 
o.name_japanese, 
o.name_french, 
o.object_description 
FROM 
objects AS o 
WHERE 
o.name_english LIKE CONCAT('%',:search,'%') OR 
o.name_japanese LIKE CONCAT('%',:search,'%') OR 
o.name_french LIKE CONCAT('%',:search,'%')  
ORDER BY 
o.name_english, o.name_japanese, o.name_french ASC 

而且一些條目是這樣的:

Tin spoon, 
Tin Foil, 
Doctor Martin Shoes, 
Martini glass, 
Cutting board, 
Ting Soda. 

因此,當用戶搜索單詞「Tin」時,它將返回所有這些結果,但我只想返回包含術語「Tin」的結果或顯示結果,並按相關性順序對它們排序。我怎樣才能做到這一點?

謝謝。

回答

4

您可以使用MySQL FULLTEXT索引來做到這一點。這需要MyISAM表類型,(name_english,name_japanese,name_french,object_description)上的索引或您想要搜索的任何字段,以及MATCH ... AGAINST運算符在該組列上的適當使用。

請參閱手冊在http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html和下頁http://dev.mysql.com/doc/refman/5.5/en/fulltext-natural-language.html

+0

謝謝,但由於我是新手,請介意我的天真問題。由於我只是比較/搜索對象的名稱,有些人告訴我沒有必要使用FULLTEXT,除非它是一段文字,我不確定。並將錶轉換爲MYISAM/FULLTEXT影響性能/速度?我讀過很多文章,但沒有一篇真正解釋我的案例。感謝你的寶貴時間。 – 2011-03-31 07:16:39

+0

FULLTEXT是一種索引類型。索引是一種加速數據訪問(搜索)的數據結構。特定索引類型FULLTEXT使您能夠根據完整(非部分)字快速訪問各種VARCHAR,CHAR或TEXT字段。這完全匹配你的問題陳述。嘗試一下並對其進行基準測試。將表從InnoDB轉換爲MyISAM具有性能和大小的影響,特別是如果你有很多併發寫入。同時也是基準。您可能希望以1:1的關係將可搜索列設置爲單獨的表格。 – Isotopp 2011-03-31 09:31:28

+0

感謝您的解釋...並且由於表格只會每週更新/有寫操作,因此我認爲這種影響應該是最小的=)我將前往嘗試。再次感謝 – 2011-03-31 09:53:37

0

這應該是個訣竅 - 你可能不得不過濾出重複的東西,但基本的想法很明顯。

SELECT 
    `object`.`object_id`, 
    `object`.`name_english`, 
    `object`.`name_japanese`, 
    `object`.`name_french`, 
    `object`.`object_info`, 1 as ranking 
    FROM `objects` AS `object` 
    WHERE `object`.`name_english` LIKE CONCAT(:search,'%') OR `object`.`name_japanese` LIKE CONCAT(:search,'%') OR `object`.`name_french` LIKE CONCAT(:search,'%') 
union 
    SELECT 
    `object`.`object_id`, 
    `object`.`name_english`, 
    `object`.`name_japanese`, 
    `object`.`name_french`, 
    `object`.`object_info`, 10 as ranking 
    FROM `objects` AS `object` 
    WHERE `object`.`name_english` LIKE CONCAT('%',:search,'%') OR `object`.`name_japanese` LIKE CONCAT('%',:search,'%') OR `object`.`name_french` LIKE CONCAT('%',:search,'%') 
ORDER BY ranking, `object`.`name_english`, `object`.`name_japanese`, `object`.`name_french` ASC 
1

的實例在運行上述查詢後,您將得到所有排序的結果,包括那些你不感興趣,但你可以使用正則表達式在上面的結果(由MySQL服務器返回)設置篩選出你需要什麼。