【问题标题】:How to build a list of filterable options from a query result?如何从查询结果中构建可过滤选项列表?
【发布时间】:2014-01-02 09:57:58
【问题描述】:

我有一个产品集合,每个产品都会有:

  1. 价格
  2. 属性(例如:尺码:xl、s、xxl;颜色:黄、红、蓝;....)
  3. 制造商
  4. 类别(一个产品可以属于多个类别)

这个集合在 ElasticSearch 中被索引。现在,当我查询 A 类中所有产品的列表时,我还想得到:

  1. 所有产品的价格范围(最低 - 最高)
  2. 所有可能的选项和值的列表(尺寸、颜色和相应的值 xl、s、xxl、黄色、红色、蓝色)
  3. 制造商(耐克、阿迪达斯、....)
  4. 类别

然后我将使用这些信息来构建一个过滤器,用户可以使用它来缩小结果列表(类似于在许多其他电子商务网站上看到的过滤器,例如 Amazon、Overstock、Ebay...)

我研究了构面搜索,但不确定这是否是我想要的,我很想找到一种方法,以尽可能少的查询来检索我需要的所有信息。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    Facets 绝对是亚马逊类别搜索风格的最佳选择。为了在尽可能少的查询中检索所有方面,您可以很容易地做到这一点,只需包含更多。我使用了 Sense chrome 扩展,因为它非常漂亮且易于用于搜索示例。对于这个例子,我放置了一些带有名称、价格、制造商、类别、颜色的产品文档。如您所见,我们已经在 match all 中搜索了所有这些方面。你可以做你喜欢的查询,甚至做全局方面,或任意数量的方面(范围、直方图等)。这实际上完全取决于您想要什么文件,以及数据是如何形成的。其中一个非常令人兴奋的部分是下一件大事Aggregations!您可以使用聚合进行出色的搜索。假设您有一个时间戳和一个位置,您可以对特定位置的时间之间的颜色进行聚合。 qbox.io 将发布一篇博文,介绍未来几天您可以使用 aggs 做的一些有趣的事情。

    DELETE /test_index
    
    PUT /test_index
    
    PUT /test_index/product/1
    {
       "name":"prod1",
       "price":19.95,
       "manufacturer":"manu1",
       "category":["cat1","cat2"],
       "color":"red"
    }
    
    PUT /test_index/product/2
    {
       "name":"prod2",
       "price":25,
       "manufacturer":"manu2",
       "category":["cat2","cat3"],
       "color":"yellow"
    }
    
    PUT /test_index/product/3
    {
       "name":"prod3",
       "price":4.99,
       "manufacturer":"manu2",
       "category":["cat1","cat2","cat3"],
       "color":"yellow"
    }
    
    PUT /test_index/product/4
    {
       "name":"prod4",
       "price":19.95,
       "manufacturer":"manu3",
       "category":["cat1","cat3"],
       "color":"blue"
    }
    
    POST /test_index/_search
    {
       "query": {
           "match_all": {}
       },
       "facets" : {
           "price_stats" : {
               "statistical" : {
                   "field" : "price"
               }
           },
           "color_terms" : {
               "terms": {
                  "field": "color",
                  "size": 10
               }
           },
           "manufacturer_terms" : {
               "terms": {
                  "field": "manufacturer",
                  "size": 10
               }
           },
           "category_terms" : {
               "terms": {
                  "field": "category",
                  "size": 10
               }
           }
       }
    }`
    

    【讨论】:

      【解决方案2】:

      如果您想领先于 ElasticSearch 游戏,何不查看最新的 ElasticSearch 测试版,发现 here,其中包括 聚合Here 是一篇很好的博客文章,解释了聚合及其与方面的差异,以及它的无限可能性。

      ElasticSearch 1.0.0 离我们不远了,所以不要太担心成为 Beta 计划的一部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 1970-01-01
        • 1970-01-01
        • 2020-10-05
        相关资源
        最近更新 更多