2013-10-06 46 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');