0

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

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

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

问题

ebuyer.comNewegg.com等网站是如何设计分面搜索的?

我是否错过了另一种方法,或者他们只是继续使用 EAV 结构?我希望避免像 Lucene/Solr 这样的企业解决方案。

4

4 回答 4

3

http://wiki.apache.org/solr/PublicServers

Ebuyer 使用 solr 并且有充分的理由,您冒着重新发明轮子的风险。

于 2014-01-04T03:23:31.103 回答
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,因为您的应用程序知道它的含义。

于 2011-06-04T03:06:06.093 回答
1

好吧,您为什么称 Lucene/Solr 企业明智的解决方案……在我看来,这似乎完全符合您的需求。

于 2010-12-06T09:09:37.533 回答
0

我认为您正在混合不同的概念(这反过来可能会使找到解决方案变得更加困难)。

分面搜索基本上意味着按“项目”的特定质量进行过滤。该质量或属性可能是它所在的类别,也可能是其他东西。

例如,您可以对按年龄过滤的用户进行分面搜索

[    User   ]
| name char |
| age  int  |

您如何调整 Solr(或 Sphinx)以获得最终结果可能会有所不同,但它不会影响您的数据模型。

我将从概念化/建模您试图在数据库中表示/存储的内容开始。你如何显示它或搜索它稍后会出现。

没有更多细节,你关于其他网站的问题designed their faceted search太宽泛了,同时也很简单:你只需要根据产品的不同属性生成不同的方面;但您似乎也想知道他们如何为数据库建模来存储信息。

于 2012-07-03T21:18:34.980 回答