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

时间:2011-08-31 11:40:12

标签: php magento solr faceted-search layered-navigation

我打算在我的电子商务商店中设置过滤系统(优化搜索)。您可以在此处查看示例:http://www.bettymills.com/shop/product/find/Air+and+HVAC+Filters

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

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

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

非常感谢详细解释。

4 个答案:

答案 0 :(得分:50)

分层导航==分面搜索。

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

表现是主要的权衡。

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

Solr的缺点是它需要您配置,安全并在您的服务器上运行另一项服务。根据您的配置(Tomcat,jetty等),它也可能是CPU和内存密集型。

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

因此,在您的结果集中,您知道有些产品的颜色为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,并包含两个方面:颜色方面blue和部门home。这会给你:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

从solr框中,你可以使用计算的方面,范围,选择一个方面或排除一个方面,声明一个方面是单值,还是多值,具有非常低的cpu / ram成本

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

答案 3 :(得分:0)

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