ElasticSearch 按列表字段中的属性聚合

ElasticSearch Aggregate by attribute in field which is list

我有一些文章,每篇文章可能有一些审稿人,每个审稿人可能有不同的批准状态,如下所示:

{
  ArticleId: 1,
  Title: "1",
  Reviewers: [
    {
       "Reviewer": "abc",
       "Status": "Pending"
    },
    {
       "Reviewer": "def",
       "Status": "Approved"
    }
  ]
}

{
  ArticleId: 2,
  Title: "2",
  Reviewers: [
    {
       "Reviewer": "abc",
       "Status": "Approved"
    },
    {
       "Reviewer": "def",
       "Status": "Approved"
    }
  ]
}

{
  ArticleId: 3,
  Title: "2",
  Reviewers: [
    {
       "Reviewer": "def",
       "Status": "Approved"
    }
  ]
}

我想把这个数据保存在ES里,搜索所有审稿人是abc的文章,按abc的审稿状态汇总。

{
 ...
 buckets:[{
        "doc_count": "1",
        "Key": "Pending"
    },{
        "doc_count": "1",
        "Key": "Approved"
    }]
}

我想知道如何在 ES 中做到这一点?

假设:评论者是嵌套类型。

试试下面的查询。详细信息在代码中作为注释。

 {
  "size": 0, 
  "aggs": {
    "NAME": {
      "nested": {              // <========== Use nested aggregation
        "path": "Reviewers"
      },
      "aggs": {
        "NAME": {
          "filter": {
            "term": {
              "Reviewers.Reviewer.keyword": "abc" // <========= Filter docs with reviewer = abc
            }
          },
          "aggs": {
            "NAME": {
              "terms": {
                "field": "Reviewers.Status.keyword", // <======= aggregate based on reviewer status
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}