MST
星途 面试题库

面试题:ElasticSearch度量值聚合之专家难度题

在复杂的ElasticSearch文档结构中,嵌套文档内有多个数值字段,现在需要对不同层级的数值字段分别进行求和、求最大值等聚合操作,同时还要基于其他字段进行过滤,最后将结果按照特定字段排序展示。请详细阐述实现思路并给出DSL示例。
27.5万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 过滤:使用 bool 过滤器中的 filter 子句,基于其他字段进行过滤。
  2. 聚合操作
    • 对于嵌套文档中的数值字段,需要使用 nested 聚合来深入嵌套文档层级。
    • nested 聚合内部,针对不同的数值字段分别使用 summax 聚合。
  3. 排序:使用 sort 子句,按照特定字段进行排序展示。

DSL 示例

假设文档结构如下:

{
  "user": "John Doe",
  "nested_field": [
    {
      "value1": 10,
      "value2": 20,
      "filter_field": "some_value"
    },
    {
      "value1": 15,
      "value2": 25,
      "filter_field": "some_value"
    }
  ]
}

DSL 如下:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "filter_field": "some_value"
          }
        }
      ]
    }
  },
  "aggs": {
    "nested_agg": {
      "nested": {
        "path": "nested_field"
      },
      "aggs": {
        "sum_value1": {
          "sum": {
            "field": "nested_field.value1"
          }
        },
        "max_value2": {
          "max": {
            "field": "nested_field.value2"
          }
        }
      }
    }
  },
  "sort": [
    {
      "user": {
        "order": "asc"
      }
    }
  ]
}

在上述示例中:

  • query.bool.filter 部分基于 filter_field 进行过滤。
  • aggs.nested_agg 使用 nested 聚合深入 nested_field 嵌套层级。
  • aggs.nested_agg.aggs.sum_value1aggs.nested_agg.aggs.max_value2 分别对 nested_field 中的 value1value2 字段进行求和与求最大值操作。
  • sort 部分按照 user 字段升序排序。实际应用中,sort 字段可根据需求替换为特定字段。