Elasticsearch:如何从嵌套文档聚合到每个主文档?

发布于 2025-01-17 07:55:11 字数 1837 浏览 4 评论 0 原文

是否有一种语法可以将嵌套文档聚合到每个主文档?例如,在下面的示例中,我如何取回每支球队最年轻的球员?我正在使用 Elasticsearch 7.10。

PUT sample
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "teamId": { "type": "keyword", "index": true, "doc_values": true },
      "members": {
        "type": "nested",
        "properties": {
          "memberId": { "type": "keyword", "index": true, "doc_values": true },
          "age": { "type": "integer", "index": true, "doc_values": true}
        }
      }
    }
  }
}

PUT sample/_doc/1
{
      "teamId" : "A"
    , "members" :
      [
          { "memberId" : "A1" , "age" : "11" }
        , { "memberId" : "A2" , "age" : "21" }
        , { "memberId" : "A3" , "age" : "31" }
      ]                                      
}                                            
                                             
PUT sample/_doc/2                            
{                                            
      "teamId" : "B"                         
    , "members" :                            
      [                                      
          { "memberId" : "B1" , "age" : "12" }
        , { "memberId" : "B2" , "age" : "22" }
        , { "memberId" : "B3" , "age" : "32" }
        , { "memberId" : "B4" , "age" : "42" }
      ]                                      
}                                            
                                             
                                             
PUT sample/_doc/3                            
{                                            
      "teamId" : "C"                         
    , "members" :                            
      [                                      
          { "memberId" : "C1" , "age" : "13" }
        , { "memberId" : "C2" , "age" : "23" }
        , { "memberId" : "C3" , "age" : "33" }
      ]
}

Is there a syntax to aggregate nested documents up to each main document? For example, how would I get back the youngest player for each team in the example below? I'm using Elasticsearch 7.10.

PUT sample
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "teamId": { "type": "keyword", "index": true, "doc_values": true },
      "members": {
        "type": "nested",
        "properties": {
          "memberId": { "type": "keyword", "index": true, "doc_values": true },
          "age": { "type": "integer", "index": true, "doc_values": true}
        }
      }
    }
  }
}

PUT sample/_doc/1
{
      "teamId" : "A"
    , "members" :
      [
          { "memberId" : "A1" , "age" : "11" }
        , { "memberId" : "A2" , "age" : "21" }
        , { "memberId" : "A3" , "age" : "31" }
      ]                                      
}                                            
                                             
PUT sample/_doc/2                            
{                                            
      "teamId" : "B"                         
    , "members" :                            
      [                                      
          { "memberId" : "B1" , "age" : "12" }
        , { "memberId" : "B2" , "age" : "22" }
        , { "memberId" : "B3" , "age" : "32" }
        , { "memberId" : "B4" , "age" : "42" }
      ]                                      
}                                            
                                             
                                             
PUT sample/_doc/3                            
{                                            
      "teamId" : "C"                         
    , "members" :                            
      [                                      
          { "memberId" : "C1" , "age" : "13" }
        , { "memberId" : "C2" , "age" : "23" }
        , { "memberId" : "C3" , "age" : "33" }
      ]
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

汐鸠 2025-01-24 07:55:11

您可以使用使用最高点击聚合,以下是工作查询,在示例数据上正常工作。

{
    "size": 0,
    "aggs": {
        "teams": {
            "terms": {
                "field": "teamId"
            },
            "aggs": {
                "members": {
                    "nested": {
                        "path": "members"
                    },
                    "aggs": {
                        "min_age_player": {
                            "top_hits": {
                                "sort": [
                                    {
                                        "members.age": {
                                            "order": "asc"
                                        }
                                    }
                                ],
                                "_source": {
                                    "includes": [
                                        "members.memberId",
                                        "members.age"
                                    ]
                                },
                                "size": 1
                            }
                        }
                    }
                }
            }
        }
    }
}

You can use the nested aggregation with top hits aggregation, below is the working query which works fine on your sample data.

{
    "size": 0,
    "aggs": {
        "teams": {
            "terms": {
                "field": "teamId"
            },
            "aggs": {
                "members": {
                    "nested": {
                        "path": "members"
                    },
                    "aggs": {
                        "min_age_player": {
                            "top_hits": {
                                "sort": [
                                    {
                                        "members.age": {
                                            "order": "asc"
                                        }
                                    }
                                ],
                                "_source": {
                                    "includes": [
                                        "members.memberId",
                                        "members.age"
                                    ]
                                },
                                "size": 1
                            }
                        }
                    }
                }
            }
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文