首页 文章

分面搜索(solr)vs通过PHP进行良好的旧过滤?

提问于
浏览
23

我打算在我的电子商务商店中设置过滤系统(优化搜索) . 你可以在这里看到一个例子:http://www.bettymills.com/shop/product/find/Air+and+HVAC+Filters

PrestaShop,OpenCart和Magento等平台拥有所谓的分层导航 .

我的问题是,与使用Solr或Lucene之类的东西进行分面导航相比,Magento或PrestaShop等平台中的分层导航有什么区别 .

可以通过php和mysql完成类似的结果吗?

非常感谢详细解释 .

4 回答

  • 1

    分层导航==分面搜索 .

    它们是相同的,但Magento和al使用不同的措辞,可能是吸引人的 . 据我所知,Magento支持Solr分面搜索或MySQL搜索 . 主要区别在于性能 .

    表现是主要的权衡 .

    要在MySQL中进行分面搜索,需要连接表,而Solr会自动索引文档构面以进行过滤 . 在平均硬件上使用Solr(多面搜索查询<100ms)通常可以实现快速响应时间 . 虽然MySQL对于相同的搜索将花费更长的时间,但可以使用索引对其进行优化以实现类似的响应时间 .

    Solr的缺点是它需要您配置, secure 并在您的服务器上运行另一项服务 . 它也可能是CPU和内存密集型,具体取决于您的配置(Tomcat,jetty等) .

    PHP / MySQL中的分面搜索是可能的,并不像你想象的那么难 .

    您需要特定的数据库模式,但这是可行的 . 这是一个简单的例子:

    product

    +----+------------+
    | id | name       |
    +----+------------+
    |  1 | blue paint |
    |  2 | red paint  |
    +----+------------+
    

    classification

    +----+----------+
    | id | name     |
    +----+----------+
    |  1 | color    |
    |  2 | material |
    |  3 | dept     |
    +----+----------+
    

    product_classification

    +------------+-------------------+-------+
    | product_id | classification_id | value |
    +------------+-------------------+-------+
    |          1 |                 1 | blue  |
    |          1 |                 2 | latex |
    |          1 |                 3 | paint |
    |          1 |                 3 | home  |
    |          2 |                 1 | red   |
    |          2 |                 2 | latex |
    |          2 |                 3 | paint |
    |          2 |                 3 | home  |
    +------------+-------------------+-------+
    

    所以,有人说搜索 paint ,你会做类似的事情:

    SELECT p.* FROM product p WHERE name LIKE '%paint%';
    

    这将返回 product 表中的两个条目 .

    搜索执行完毕后,您可以使用以下查询获取结果的关联方面(过滤器):

    SELECT c.id, c.name, pc.value FROM product p
       LEFT JOIN product_classification pc ON pc.product_id = p.id
       LEFT JOIN classification c ON c.id = pc.classification_id
    WHERE p.name LIKE '%paint%'
    GROUP BY c.id, pc.value
    ORDER BY c.id;
    

    这会给你类似的东西:

    +------+----------+-------+
    | id   | name     | value |
    +------+----------+-------+
    |    1 | color    | blue  |
    |    1 | color    | red   |
    |    2 | material | latex |
    |    3 | dept     | home  |
    |    3 | dept     | paint |
    +------+----------+-------+
    

    因此,在您的结果集中,您知道有些颜色为 bluered 的产品,其唯一的材料是 latex ,并且可以在部门 homepaint 中找到它 .

    用户选择构面后,只需修改原始搜索查询:

    SELECT p.* FROM product p
       LEFT JOIN product_classification pc ON pc.product_id = p.id
    WHERE 
       p.name LIKE '%paint%' AND (
          (pc.classification_id = 1 AND pc.value = 'blue') OR
          (pc.classification_id = 3 AND pc.value = 'home')
       )
    GROUP BY p.id
    HAVING COUNT(p.id) = 2;
    

    所以,这里用户正在搜索关键字 paint ,并包括两个方面:facet blue 表示颜色, home 表示部门 . 这会给你:

    +----+------------+
    | id | name       |
    +----+------------+
    |  1 | blue paint |
    +----+------------+
    

    所以,总之 . 尽管它在Solr中是开箱即用的,但它可以很容易地在SQL中实现它 .

  • 49

    Magento Enterprise Edition具有带有分面搜索的Solr实现 . 您仍然需要配置Solr来索引正确的数据;即Solr在具有特定端口的主机上的Java上运行 . Magento通过给定的URL连接到它 . 当Magento设置分面搜索时,它会向Solr发出请求并将接收到的xml处理为前端的表单 . 差异将是速度之一 . 要求Solr非常快 . 如果您的商店中有大约100,000种产品,并希望快速回复搜索请求,则可以使用Solr . 但是,如果你有一个单独的服务器用于具有大量内存的Magento数据库,你也可以只使用Magento 's built in Mysql based faceted search. If you don' t有钱花在Magento EE上,你可以使用this solr implementation . 但我对这个没有任何经验 .

  • 0

    在solr框之外,您可以使用计算的构面,范围,选择构面或排除构面,声明构面是单值,还是多值,cpu / ram成本非常低

    另一方面,参数和安全solr安装需要一些时间,也需要一些时间来抓取您的数据 .

  • 1

    你可以用PHP和MySQL创建分面搜索,Drupal Faceted Search就是一个很好的例子 . 但是如果您已经使用了Solr,那么您可以免费获得分面搜索 .

相关问题