分面搜索的数据库结构

时间:2010-10-22 06:20:50

标签: database-design data-structures entity-attribute-value faceted-search categorization

我正在创建一个需要具有分面搜索工具的电子商务网站,以便客户可以通过与ebuyer.comNewegg.com相同的类别和分类缩小产品搜索范围(参见左手)菜单)。

我最初直接设计了一个类似于EAV结构的数据库(我当时不知道这是什么),这最初看起来很理想,因为我可以创建无限的类别,子类别和其他产品分类(即客户可用于查找特定产品的颜色,尺寸,收件人。但是,当我开始尝试使用AND条件创建SQL查询时,我意识到正常的简单查询变得更加冗长和复杂。

在花了几个小时阅读关于SO和Google上的文章的各种帖子之后,我逐渐意识到如果我继续使用这种方法,那将会产生噩梦。

问题

ebuyer.comNewegg.com这样的网站如何设计他们的分面搜索?

我是否错过了替代方法或是否只是简单地使用了EAV结构? 我希望避免像Lucene / Solr这样的企业解决方案。

4 个答案:

答案 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如何过于宽泛,同时又非常简单的问题:您只需要根据产品的不同属性生成不同的方面;但你似乎也想知道他们如何建模他们的数据库来存储信息。