【问题标题】:How does Elastic Search aggregations get updated in ecommerce sitesElastic Search 聚合如何在电子商务网站中更新
【发布时间】:2015-08-06 16:40:06
【问题描述】:

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

例子:

品牌:
abc(100)
xyz(50)

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

尺寸:
中(60)
小(40)
大(50)

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

【问题讨论】:

  • 文档看起来很清楚 elastic.co/guide/en/elasticsearch/reference/current/… :您可以在查询中在您拥有的任何过滤器之上定义多个聚合。
  • 谢谢,我已经完成了,我的问题是每个聚合将如何与搜索结果一起更新。你能解释一下当用户实时选择聚合过滤器时会发生什么的执行流程吗?

标签: elasticsearch aggregation


【解决方案1】:

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

结果只会显示满足以下所有条件的产品:

  • 它的品牌是“brand1”或“brand2”
  • 它的颜色是“color1”或“color2”
  • 它的大小是“size1”或“size2”

类别 Brand 的聚合结果将在所有产品上进行过滤,使得每个产品都满足以下所有条件:

  • 它的颜色是“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"
         }
      }
   }
}

因此,每次过滤器选择发生变化时,都会触发一个新查询并更新结果和聚合。

【讨论】:

  • 感谢@bittusarkar 的详细解释。
猜你喜欢
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 2011-06-11
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 2012-02-16
相关资源
最近更新 更多