MST
星途 面试题库

面试题:ElasticSearch多过滤器聚合复杂条件嵌套筛选

假设有一个日志索引,每个文档记录了用户的操作,包含用户ID、操作时间、操作类型(增、删、改)以及操作模块(订单模块、用户模块等)。现在要求统计在过去一周内,订单模块中操作类型为'改'且用户ID以'user_'开头的操作次数,同时按照操作类型进一步细分统计,使用ElasticSearch的多过滤器聚合来实现,给出详细的DSL语句,并解释每个部分的作用。
10.4万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试
{
    "aggs": {
        "filtered_actions": {
            "filter": {
                "bool": {
                    "must": [
                        {
                            "range": {
                                "操作时间": {
                                    "gte": "now-1w"
                                }
                            }
                        },
                        {
                            "prefix": {
                                "用户ID": "user_"
                            }
                        },
                        {
                            "term": {
                                "操作模块": "订单模块"
                            }
                        }
                    ]
                }
            },
            "aggs": {
                "action_type_buckets": {
                    "terms": {
                        "field": "操作类型"
                    }
                }
            }
        }
    },
    "query": {
        "bool": {
            "filter": [
                {
                    "range": {
                        "操作时间": {
                            "gte": "now-1w"
                        }
                    }
                },
                {
                    "prefix": {
                        "用户ID": "user_"
                    }
                },
                {
                    "term": {
                        "操作模块": "订单模块"
                    }
                }
            ]
        }
    }
}

解释

  1. 外层 aggs:定义聚合操作。
    • filtered_actions:自定义的聚合名称,用于过滤符合条件的文档。
      • filter:定义过滤条件。
        • bool:布尔过滤器,组合多个条件。
          • must:所有条件必须满足。
            • range:筛选过去一周内的操作,gte 表示大于等于,now-1w 代表当前时间往前一周。
            • prefix:筛选用户ID以 user_ 开头的文档。
            • term:筛选操作模块为订单模块的文档。
      • aggs:在过滤后的文档上进一步聚合。
        • action_type_buckets:自定义名称,按操作类型进行细分统计。
          • terms:按 操作类型 字段进行分组统计。
  2. query:定义查询条件,与聚合中的过滤条件一致,确保只返回符合条件的文档,提升聚合效率。同样使用 bool 过滤器组合条件,包括时间范围、用户ID前缀和操作模块的过滤。