【问题标题】:Database Structure for a Faceted Search分面搜索的数据库结构
【发布时间】:2014-01-04 11:23:31
【问题描述】:

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

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

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

问题

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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,因为您的应用程序知道它的含义。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

          [    User   ]
          | name char |
          | age  int  |
          

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

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

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

          【讨论】:

            猜你喜欢
            • 2016-04-05
            • 1970-01-01
            • 1970-01-01
            • 2015-07-12
            • 2014-06-18
            • 1970-01-01
            • 2013-04-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多