2013-10-06 82 views
1

我有一個產品表,每個產品都有:品牌,集合,名稱。 我希望用戶搜索產品,但我想搜索這些搜索詞的所有三個字段,因爲用戶可能不會總是知道他們的搜索詞是用於品牌,集合還是名稱。用戶可以輕鬆搜索「searchname searchbrand」,然後我想返回品牌名稱爲搜索名稱和搜索品牌的記錄,並且還會返回包含搜索名稱或搜索品牌等名稱的記錄。需要小費在多個領域搜索[mysql優化]

我只能想出是我懷疑會執行的查詢。最好解決這個問題是什麼?在表格中創建一個額外的字段,我將品牌,收藏和名稱結合到一個字段中,然後搜索該字段?或者只用一個品牌,收藏和名稱組合的字段創建新表,然後搜索?

Gabrie

回答

1

它看起來像你需要的是一個完整的文本搜索:http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

SELECT * FROM products WHERE MATCH (brand, collection, name) AGAINST ('+searchname +searchbrand' IN BOOLEAN MODE) 

爲了更好的性能,你仍然可以創建一個單獨的表含的品牌組合中的一個領域,收藏和名稱(不要忘記全文索引)。

SELECT * FROM products_search WHERE MATCH (combination) AGAINST ('+searchname +searchbrand' IN BOOLEAN MODE) 
+0

*嘆*是這麼簡單?謝謝你,試試這個。 – Gabrie

+0

決定去你的第二個建議,並創建一個單獨的表,只有一個字段和全文索引。謝謝 – Gabrie

0

我想你應該考慮full text search

在postgresql中,您要做的是創建一個類型爲tsvector的列,該列將包含其他列的分解版本。它會照顧stemming這個詞。

alter table TABLE add column tsv_description tsvector; 

然後你需要填充它。

UPDATE TABLE SET tsv_description =  (to_tsvector('pg_catalog.english',coalesce(searchname, '')) ||  (to_tsvector('pg_catalog.english',coalesce(searchbrand, '')) ||  to_tsvector('pg_catalog.english',coalesce(othercol, '')); 

然後你就可以查詢使用to_tsquery像這樣:

select * from TABLE where tsvdescription @@ plainto_tsquery('pg_catalog.english','my super full text query'); 

您還可以列轉換爲上飛,但它的速度較慢tsvectors。

select * from TABLE where to_tsvector(searchname) || to_tsvector(searcbrand) @@ plainto_tsquery('pg_catalog.english','tocino');