繁体   English   中英

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

[英]Faceted Search (solr) vs Good old filtering via PHP?

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

PrestaShop,OpenCart和Magento等平台都具有分层导航功能。

我的问题是,与使用Solr或Lucene之类的多面导航相比,Magento或PrestaShop等平台中的分层导航有何区别?

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

非常感谢详细的解释。

分层导航==多面搜索。

他们是同一回事,但是Magento和al使用了不同的措辞,可能会引起注意。 据我所知,Magento支持Solr多面搜索或MySQL搜索。 主要区别在于性能。

性能是主要的权衡。

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

Solr的缺点是它要求您配置, 保护和运行服务器上的另一项服务。 根据您的配置(Tomcat,码头等),它也可能占用大量CPU和内存。

PHP / MySQL中的多面搜索是可能的,并且没有您想像的那么难。

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

产品

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

分类

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

产品分类

+------------+-------------------+-------+
| 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中实现它。

在solr框中,您可以使用计算的构面,范围,选择构面或排除一个构面,声明构面是单值还是多值,且CPU / RAM成本非常低

另一方面,参数化和保护solr安装需要花费一些时间,而抓取数据也需要花费一些时间。

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

您可以仅使用PHP和MySQL创建多面搜索, Drupal多面搜索就是一个很好的例子。 但是,如果您已经使用Solr,则可以免费获得包含方面的搜索。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM