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

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

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

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

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

详细的解释非常感谢。


答案 1

分层导航 == 分面搜索。

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

性能是主要的权衡。

要在MySQL中执行分面搜索,您需要联接表,而Solr会自动为文档分面编制索引以进行过滤。在平均硬件上,您通常可以使用Solr(多方面搜索查询<100ms)实现快速响应时间。虽然MySQL需要更长的时间进行相同的搜索,但它可以使用索引进行优化,以实现相似的响应时间。

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

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

您需要一个特定的数据库架构,但这是可行的。下面是一个简单的示例:

产品

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

分类

+----+----------+
| 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 |
+------+----------+-------+

因此,在结果集中,您知道有些产品的颜色是 和 ,制作它的唯一材料是 ,并且可以在部门和 中找到。blueredlatexhomepaint

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

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;

因此,在这里,用户正在搜索 关键字 ,并包括两个方面:颜色的分面和部门的方面。这将为您提供:paintbluehome

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

所以,总而言之。虽然它在Solr中是开箱即用的,但它可以相当容易地在SQL中实现它。


答案 2

Magento Enterprise Edition具有Solr的实现,具有分面搜索功能。您仍然需要配置Solr以索引正确的数据;即Solr在具有特定端口的主机上的Java上运行。Magento通过给定的URL连接到它。当Magento设置分面搜索时,它会向Solr发出请求,并将收到的xml处理到前端的表单中。区别在于速度。向Solr请求非常快。如果您的商店中有超过100,000种产品,并且希望快速响应搜索请求,则可以使用Solr。但是,如果您为具有大量内存的Magento数据库提供了单独的服务器,则也可以使用Magento内置的基于Mysql的分面搜索。如果您没有钱花在Magento EE上,则可以使用此solr实现。但我对这个没有任何经验。


推荐