1

我有一张产品表,每个产品都有:品牌、收藏、名称。我希望用户搜索产品,但我想在所有三个字段中搜索这些搜索词,因为用户可能并不总是知道他们的搜索词是品牌、收藏还是名称。用户可以轻松地搜索“searchname searchbrand”,然后我想返回品牌为 searchname 和 searchbrand 的记录,以及包含诸如 searchname 或 searchbrand 之类的名称的记录。

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

加布里

4

3 回答 3

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)
于 2013-10-06T09:31:30.347 回答
1

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

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

于 2013-10-06T09:34:36.287 回答
0

我认为您应该研究全文搜索

在 postgresql 中,您要做的是创建一个 tsvector 类型的列,该列由其他列的分解版本组成。它会处理词干

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');

您还可以即时将列转换为 tsvector,但速度较慢。

select * from TABLE where to_tsvector(searchname) || to_tsvector(searcbrand) @@ plainto_tsquery('pg_catalog.english','tocino');
于 2013-10-06T09:34:01.740 回答