【问题标题】:Need tip on searching through multiple fields [mysql optimization]多字段搜索需要技巧【mysql优化】
【发布时间】:2013-10-12 23:44:35
【问题描述】:

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

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

加布里

【问题讨论】:

    标签: mysql sql performance search


    【解决方案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)
    

    【讨论】:

    • sigh 就这么简单吗?谢谢,打算试试这个。
    • 决定采纳您的第二个建议并创建一个单独的表,其中只有一个字段和全文索引。谢谢
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我认为你应该看看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');
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-18
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多