我有一个产品表,每个产品都有:品牌,集合,名称。 我希望用户搜索产品,但我想在这三个字段中搜索这些搜索词,因为用户可能不会总是知道他们的搜索词是用于品牌,集合还是名称。用户可以轻松搜索“searchname searchbrand”,然后我想返回品牌为searchname和searchbrand的记录,还包含包含searchname或searchbrand等名称的记录。
我只能提出我怀疑会执行的查询。什么最好解决这个问题?在表格中创建一个额外的字段,我将品牌,集合和名称组合到一个字段,然后搜索它?或者创建只有一个字段的新表,该字段是品牌,集合和名称的组合并搜索它?
Gabrie
答案 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,请参阅此链接以了解更多信息
答案 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');