我正在创建一个需要具有分面搜索工具的电子商务网站,以便客户可以通过与ebuyer.com和Newegg.com相同的类别和分类缩小产品搜索范围(参见左手)菜单)。
我最初直接设计了一个类似于EAV结构的数据库(我当时不知道这是什么),这最初看起来很理想,因为我可以创建无限的类别,子类别和其他产品分类(即客户可用于查找特定产品的颜色,尺寸,收件人。但是,当我开始尝试使用AND
条件创建SQL查询时,我意识到正常的简单查询变得更加冗长和复杂。
在花了几个小时阅读关于SO和Google上的文章的各种帖子之后,我逐渐意识到如果我继续使用这种方法,那将会产生噩梦。
问题
ebuyer.com和Newegg.com这样的网站如何设计他们的分面搜索?
我是否错过了替代方法或是否只是简单地使用了EAV结构? 我希望避免像Lucene / Solr这样的企业解决方案。
答案 0 :(得分:2)
我不知道他们是如何做到的,但你可以通过以下方式实现这一目标:
CREATE TABLE product_facets (
product_id INTEGER NOT NULL,
facet VARCHAR(100) NOT NULL,
facet_value varchar(255) NOT NULL,
PRIMARY KEY (product_id,facet,facet_value),
KEY (facet,facet_value)
);
INSERT INTO product_facets VALUES (1, 'COLOR', 'Red');
INSERT INTO product_facets VALUES (1, 'PRICE_RANGE', 'Less than 200');
INSERT INTO product_facets VALUES (2, 'COLOR', 'Green');
INSERT INTO product_facets VALUES (2, 'PRICE_RANGE', 'From $200 to $500');
INSERT INTO product_facets VALUES (2, 'COLOR', 'Blue');
INSERT INTO product_facets VALUES (3, 'PRICE_RANGE', 'More than $1000');
SELECT facet, facet_value, count(*)
FROM product_facets f
INNER JOIN products p ON p.product_id = f.product_id
GROUP BY facet, facet_value;
facet 不一定是VARCHAR。它可以是一个简单的INTEGER,因为您的应用程序知道它的含义。
答案 1 :(得分:2)
http://wiki.apache.org/solr/PublicServers
Ebuyer使用solr并且有充分的理由,你冒着重新发明轮子的风险。
答案 2 :(得分:1)
那你为什么称Lucene / Solr为企业明智的解决方案......在我看来似乎完全符合你的需要。
答案 3 :(得分:0)
我认为你正在混合不同的概念(这反过来可能会使找到解决方案变得更加困难)。
分面搜索意味着过滤特定质量的“项目”。该质量或财产可能属于其所属的类别,或者可能是其他类别。
您可以按用户的年龄对用户进行分面搜索,例如
[ User ]
| name char |
| age int |
如何调整Solr(或Sphinx)以获得最终结果可能会有所不同,但它对您的数据模型没有影响。
首先,我将概念化/建模您尝试在数据库中表示/存储的内容。如何显示或搜索它。
如果没有更多详细信息,您对其他网站designed their faceted search
如何过于宽泛,同时又非常简单的问题:您只需要根据产品的不同属性生成不同的方面;但你似乎也想知道他们如何建模他们的数据库来存储信息。