如何在电子商务网站

时间:2015-08-06 06:03:19

标签: elasticsearch aggregation

电子商务网站中有多个聚合,如果用户选择过滤器,其他聚合如何更新?是为每个聚合发送单个请求还是单个请求将处理所有聚合更新。

示例:

品牌:
  ABC(100)
  xyz(50)

颜色
  红色(110)
  白色(40)

尺寸:
  介质(60)
  小(40)
  大(50)

如果用户选择“红色”和“中等” 是否会发送个人请求“颜色”聚合和“大小”聚合? 解释这在实时电子商务网站中是如何发生的

1 个答案:

答案 0 :(得分:4)

选择品牌“brand1”和“brand2”,选择颜色“color1”和“color2”,选择尺寸“size1”和“size2”。

结果仅显示产品,使每种产品满足以下所有条件:

  • 其品牌为“brand1”或“brand2”
  • 其颜色为“color1”或“color2”
  • 其大小为“size1”或“size2”

类别的聚合结果将对所有产品进行过滤,以便每种产品满足以下所有条件:

  • 其颜色为“color1”或“color2”
  • 其大小为“size1”或“size2”

类似于颜色和尺寸类别。

考虑到所有这些因素,我们可以创建一个Elasticsearch查询请求,以提供所有结果以及所有聚合(参见下文)。

POST _search
{
   "filter": {
      "bool": {
         "must": [
            {
               "terms": {
                  "brand": [
                     "brand1",
                     "brand2"
                  ]
               }
            },
            {
               "terms": {
                  "color": [
                     "color1",
                     "color2"
                  ]
               }
            },
            {
               "terms": {
                  "size": [
                     "size1",
                     "size2"
                  ]
               }
            }
         ]
      }
   },
   "aggs": {
      "filtered_brand_aggs": {
         "filter": {
            "bool": {
               "must": [
                  {
                     "terms": {
                        "color": [
                           "color1",
                           "color2"
                        ]
                     }
                  },
                  {
                     "terms": {
                        "size": [
                           "size1",
                           "size2"
                        ]
                     }
                  }
               ]
            }
         },
         "aggs": {
            "brand_aggs": {
               "terms": {
                  "field": "brand"
               }
            }
         }
      },
      "filtered_color_aggs": {
         "filter": {
            "bool": {
               "must": [
                  {
                     "terms": {
                        "brand": [
                           "brand1",
                           "brand2"
                        ]
                     }
                  },
                  {
                     "terms": {
                        "size": [
                           "size1",
                           "size2"
                        ]
                     }
                  }
               ]
            }
         },
         "aggs": {
            "color_aggs": {
               "terms": {
                  "field": "color"
               }
            }
         }
      },
      "filtered_size_aggs": {
         "filter": {
            "bool": {
               "must": [
                  {
                     "terms": {
                        "color": [
                           "color1",
                           "color2"
                        ]
                     }
                  },
                  {
                     "terms": {
                        "brand": [
                           "brand1",
                           "brand2"
                        ]
                     }
                  }
               ]
            }
         },
         "aggs": {
            "size_aggs": {
               "terms": {
                  "field": "size"
               }
            }
         }
      }
   }
}

这是最通用的查询。当然,必须根据过滤器选择修改此查询。如果说没有选择品牌过滤器,则品牌字段的所有terms过滤器都会消失。其他领域也是如此。如果没有选择过滤器,您基本上会得到以下查询:

POST _search
{
   "aggs": {
      "brand_aggs": {
         "terms": {
            "field": "brand"
         }
      },
      "color_aggs": {
         "terms": {
            "field": "color"
         }
      },
      "size_aggs": {
         "terms": {
            "field": "size"
         }
      }
   }
}

因此,每次筛选器选择更改时,都会触发新查询并更新结果和聚合。