MST

星途 面试题库

面试题:ElasticSearch聚合在电商商品价格分析中的应用

在电商场景中,假设我们有大量商品数据存储在ElasticSearch中,每个文档代表一个商品,包含价格字段。请描述如何使用ElasticSearch的聚合功能,计算出不同价格区间的商品数量占总商品数量的比例,并以百分比形式展示。同时说明可能会用到的聚合类型及相关参数。
10.6万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试
  1. 聚合类型
    • 范围聚合(Range Aggregation):用于将数据按照指定的价格范围进行分组。
    • 桶聚合(Bucket Aggregation):范围聚合属于桶聚合的一种,它会创建不同的桶(每个桶代表一个价格区间),将符合该区间条件的文档放入对应的桶中。
    • 指标聚合(Metric Aggregation):这里使用 cardinality 指标聚合来计算每个价格区间(桶)内商品的数量。还会使用 bucket_script 脚本聚合来计算每个桶内商品数量占总商品数量的百分比。
  2. 相关参数
    • 范围聚合参数
      • ranges:定义价格范围的数组。例如:
{
    "ranges": [
        {
            "from": 0,
            "to": 100
        },
        {
            "from": 100,
            "to": 200
        },
        {
            "from": 200,
            "to": null
        }
    ]
}

这里定义了三个价格区间:0 - 100,100 - 200,200及以上。

  • 指标聚合参数 - cardinality
    • field:指定要计算数量的字段,这里是商品文档中的价格字段,例如 price
  • 脚本聚合参数 - bucket_script
    • buckets_path:指定要引用的桶内指标路径,例如 count(假设 cardinality 计算出的数量指标名为 count)。
    • script:计算百分比的脚本,例如 params.count / params._count * 100。其中 params._count 是所有文档的总数,params.count 是当前桶内文档数。
  1. 示例查询
{
    "aggs": {
        "price_ranges": {
            "range": {
                "field": "price",
                "ranges": [
                    {
                        "from": 0,
                        "to": 100
                    },
                    {
                        "from": 100,
                        "to": 200
                    },
                    {
                        "from": 200,
                        "to": null
                    }
                ]
            },
            "aggs": {
                "count": {
                    "cardinality": {
                        "field": "price"
                    }
                },
                "percentage": {
                    "bucket_script": {
                        "buckets_path": {
                            "count": "count"
                        },
                        "script": "params.count / params._count * 100"
                    }
                }
            }
        }
    }
}

这个查询会对商品数据按价格范围进行聚合,计算每个范围的商品数量及占总商品数量的百分比。