对象数组上的聚合

发布于 2025-01-12 23:37:28 字数 644 浏览 8 评论 0原文

我的弹性中有以下数据。

{
...someData,
languages: [
{
language:{_id: 1, name:"English"}
},
{
language:{_id: 2, name:"Arabic"}
}
]
}

但是当我使用此查询聚合数据时,

    aggs: {

languages: {
            terms: {
                field: "languages.language._id.keyword",
                size: 50
            },
            aggs: {
                value: {
                    terms: {
                        field: "languages.language.name.keyword"
                    }
                }
            }
        }
}

我将获得带有 2 个阿拉伯语和英语桶的英语 ID 阿拉伯语 id 也是如此,因为从技术上讲它包含在那里。

有没有办法只返回我需要的对象的数量?

谢谢

I have the following data in my elastic.

{
...someData,
languages: [
{
language:{_id: 1, name:"English"}
},
{
language:{_id: 2, name:"Arabic"}
}
]
}

But when I aggregate the data using this query

    aggs: {

languages: {
            terms: {
                field: "languages.language._id.keyword",
                size: 50
            },
            aggs: {
                value: {
                    terms: {
                        field: "languages.language.name.keyword"
                    }
                }
            }
        }
}

I will get the English id with 2 buckets for Arabic and English
and same for Arabic id, because technically its included there.

Is there a way to return only the count of the object I need?

Thanks

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

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

发布评论

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

评论(2

伤痕我心 2025-01-19 23:37:28

您需要将 languages 字段定义为嵌套,以便对数组的各个元素应用聚合。

配置的嵌套字段:

PUT index0
{
  "mappings": {
    "properties": {
      "languages":{
        "type": "nested"
      }
    }
  }
}

示例文档索引:

POST index0/_doc
{
  "languages": [
    {
      "language": {
        "_id": 1,
        "name": "English"
      }
    },
    {
      "language": {
        "_id": 2,
        "name": "Arabic"
      }
    }
  ]
}

示例聚合查询:

{
  "size": 0,
  "aggs": {
    "languages": {
      "nested": {
        "path": "languages"
      },
      "aggs": {
        "id": {
          "terms": {
            "field": "languages.language._id",
            "size": 10
          },
          "aggs": {
            "name": {
              "terms": {
                "field": "languages.language.name.keyword",
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

结果:

"aggregations" : {
    "languages" : {
      "doc_count" : 2,
      "id" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : 1,
            "doc_count" : 1,
            "name" : {
              "doc_count_error_upper_bound" : 0,
              "sum_other_doc_count" : 0,
              "buckets" : [
                {
                  "key" : "English",
                  "doc_count" : 1
                }
              ]
            }
          },
          {
            "key" : 2,
            "doc_count" : 1,
            "name" : {
              "doc_count_error_upper_bound" : 0,
              "sum_other_doc_count" : 0,
              "buckets" : [
                {
                  "key" : "Arabic",
                  "doc_count" : 1
                }
              ]
            }
          }
        ]
      }
    }
  }

You need to define languages field as nested for applying aggregation on individual element of array.

Configured Nested field:

PUT index0
{
  "mappings": {
    "properties": {
      "languages":{
        "type": "nested"
      }
    }
  }
}

Sample document index:

POST index0/_doc
{
  "languages": [
    {
      "language": {
        "_id": 1,
        "name": "English"
      }
    },
    {
      "language": {
        "_id": 2,
        "name": "Arabic"
      }
    }
  ]
}

Sample Aggregation Query:

{
  "size": 0,
  "aggs": {
    "languages": {
      "nested": {
        "path": "languages"
      },
      "aggs": {
        "id": {
          "terms": {
            "field": "languages.language._id",
            "size": 10
          },
          "aggs": {
            "name": {
              "terms": {
                "field": "languages.language.name.keyword",
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

Result:

"aggregations" : {
    "languages" : {
      "doc_count" : 2,
      "id" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : 1,
            "doc_count" : 1,
            "name" : {
              "doc_count_error_upper_bound" : 0,
              "sum_other_doc_count" : 0,
              "buckets" : [
                {
                  "key" : "English",
                  "doc_count" : 1
                }
              ]
            }
          },
          {
            "key" : 2,
            "doc_count" : 1,
            "name" : {
              "doc_count_error_upper_bound" : 0,
              "sum_other_doc_count" : 0,
              "buckets" : [
                {
                  "key" : "Arabic",
                  "doc_count" : 1
                }
              ]
            }
          }
        ]
      }
    }
  }
我们的影子 2025-01-19 23:37:28

您是否尝试过此操作:


    aggs: {

languages: {
            terms: {
                field: "languages.language._id.keyword",
                size: 50
            },
      }
 
}

您不需要其他聚合。您可以使用doc_count键访问

Did you try this :


    aggs: {

languages: {
            terms: {
                field: "languages.language._id.keyword",
                size: 50
            },
      }
 
}

You do not need the other aggregation. You can access using the doc_count key

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文