26

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

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

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

仅通过 php 和 mysql 可以实现类似的结果吗?

非常感谢详细的解释。

4

4 回答 4

52

分层导航 == 分面搜索。

它们是同一个东西,但是 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_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,并且可以在部门home和中找到paint

一旦用户选择了一个方面,只需修改原始搜索查询:

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

于 2011-08-31T13:49:44.690 回答
1

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

于 2011-08-31T13:05:43.783 回答
1

开箱即用,您可以使用计算的方面、范围、选择一个方面或排除一个方面,声明一个方面是单值还是多值,且 CPU/RAM 成本非常低

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

于 2012-05-02T19:44:03.970 回答
0

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

于 2011-08-31T13:07:19.053 回答