首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分面搜索(solr)还是通过PHP的老旧过滤?

分面搜索(solr)还是通过PHP的老旧过滤?
EN

Stack Overflow用户
提问于 2011-08-31 19:40:12
回答 4查看 14.3K关注 0票数 26

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

像PrestaShop,OpenCart和Magento这样的平台都有所谓的分层导航。

我的问题是,与使用Solr或Lucene进行分面导航相比,Magento或PrestaShop等平台中的分层导航有什么不同。

仅仅通过php和mysql就能实现类似的结果吗?

一个详细的解释是非常感谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-31 21:49:45

分层导航==分面搜索。

它们是一样的,但Magento和al使用了不同的措辞,可能是为了吸引眼球。据我所知,Magento既支持Solr方面搜索,也支持MySQL搜索。主要区别在于性能。

性能是主要的权衡。

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

Solr的缺点是,它需要您配置、secure并在您的服务器上运行另一个服务。根据您的配置(Tomcat、jetty等),它也会占用相当多的CPU和内存。

PHP/MySQL中的分面搜索是可能的,而且并不像您想象的那么难。

您需要一个特定的数据库模式,但这是可行的。下面是一个简单的例子:

产品

代码语言:javascript
复制
+----+------------+
| id | name       |
+----+------------+
|  1 | blue paint |
|  2 | red paint  |
+----+------------+

classification

代码语言:javascript
复制
+----+----------+
| id | name     |
+----+----------+
|  1 | color    |
|  2 | material |
|  3 | dept     |
+----+----------+

product_classification

代码语言:javascript
复制
+------------+-------------------+-------+
| 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,你会这样做:

代码语言:javascript
复制
SELECT p.* FROM product p WHERE name LIKE '%paint%';

这将返回product表中的两个条目。

一旦执行了搜索,您就可以使用如下查询获取结果的相关方面(过滤器):

代码语言:javascript
复制
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;

这将为您提供类似以下内容:

代码语言:javascript
复制
+------+----------+-------+
| id   | name     | value |
+------+----------+-------+
|    1 | color    | blue  |
|    1 | color    | red   |
|    2 | material | latex |
|    3 | dept     | home  |
|    3 | dept     | paint |
+------+----------+-------+

因此,在您的结果集中,您知道有些产品的颜色是bluered,制造它的唯一材料是latex,并且可以在部门homepaint中找到它。

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

代码语言:javascript
复制
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,它包括两个方面:代表颜色的facet blue和代表部门的home。这将为您提供:

代码语言:javascript
复制
+----+------------+
| id | name       |
+----+------------+
|  1 | blue paint |
+----+------------+

所以,总结一下。尽管它在Solr中开箱即用,但在SQL中也可以很容易地实现它。

票数 52
EN

Stack Overflow用户

发布于 2011-08-31 21:05:44

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

票数 1
EN

Stack Overflow用户

发布于 2012-05-03 03:44:04

在solr框之外,您可以使用计算的facet、range、选择一个facet或排除一个facet、声明facet是单值还是多值,并且cpu/ram开销非常低。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7256405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档