分层导航 == 分面搜索。
它们是一回事,但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 |
+------+----------+-------+
因此,在结果集中,您知道有些产品的颜色是 和 ,制作它的唯一材料是 ,并且可以在部门和 中找到。blue
red
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中实现它。