需要提示搜索多个字段[mysql优化]

时间:2013-10-06 09:20:00

标签: mysql sql performance search

我有一个产品表,每个产品都有:品牌,集合,名称。 我希望用户搜索产品,但我想在这三个字段中搜索这些搜索词,因为用户可能不会总是知道他们的搜索词是用于品牌,集合还是名称。用户可以轻松搜索“searchname searchbrand”,然后我想返回品牌为searchname和searchbrand的记录,还包含包含searchname或searchbrand等名称的记录。

我只能提出我怀疑会执行的查询。什么最好解决这个问题?在表格中创建一个额外的字段,我将品牌,集合和名称组合到一个字段,然后搜索它?或者创建只有一个字段的新表,该字段是品牌,集合和名称的组合并搜索它?

Gabrie

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

MySQL提供FULLTEXT,请参阅此链接以了解更多信息

http://www.petefreitag.com/item/477.c

答案 2 :(得分: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');