方面的搜索(solr)vs通过PHP的老旧的过滤?

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

诸如PrestaShop,OpenCart和Magento之类的平台有所谓的分层导航。

我的问题是像Magento或PrestaShop这样的平台之间的分层导航有什么区别,与使用像Solr或Lucene这样的方面进行导航。

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

详细的解释非常感谢。

分层导航==方面的搜索。

他们是同样的事情,但Magento和al使用不同的措辞,可能是很好看的。据我所知,Magento支持Solr面搜索或MySQL。主要区别是表现。

绩效是主要的权衡。

要在MySQL中进行分面搜索,需要连接表,而Solr自动对文档构面进行索引进行过滤。通常可以在平均硬件上使用Solr(<100ms for a multi-facet search query)来实现快速响应时间。虽然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  |
+------------+-------------------+-------+

所以说,有人寻找油漆,你会做一些像:

SELECT p.* FROM product p WHERE name LIKE '%paint%';

这将从产品表中返回两个条目。

执行搜索后,您可以使用以下查询获取结果的关联构面(过滤器):

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

所以,在你的结果集中,你知道有颜色是蓝色和红色的产品,其唯一的材料是乳胶,它可以在家庭和油漆部门找到。

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

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;

所以,这里用户正在搜索关键字绘画,并且包括两个方面:颜色的蓝色和部门的家。这会给你:

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

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

http://stackoverflow.com/questions/7256405/faceted-search-solr-vs-good-old-filtering-via-php

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:方面的搜索(solr)vs通过PHP的老旧的过滤?