ElasticSearch - 带有数组字段的子项聚合问题

ElasticSearch - issue with sub term aggregation with array fields

我有以下两个文件:

{  
"title":"The Avengers",
"year":2012,
"casting":[  
    {  
    "name":"Robert Downey Jr.",
    "category":"Actor",
    },
    {  
    "name":"Chris Evans",
    "category":"Actor",
    }
]
}

和:

{  
"title":"The Judge",
"year":2014,
"casting":[  
    {  
    "name":"Robert Downey Jr.",
    "category":"Producer",
    },
    {  
    "name":"Robert Duvall",
    "category":"Actor",
    }
]
}

我想根据两个字段执行聚合:casting.name 和 casting.category。

我尝试使用基于 casting.name 字段的 TermsAggregation 和子聚合,这是另一个基于 casting.category 字段的 TermsAggregation。

问题在于,对于 "Chris Evans" 条目,ElasticSearch 为所有类别(演员、制作人)设置了存储桶,而它应该只设置 1 个存储桶(演员)。

似乎所有 casting.category 次和所有 casting.name 次之间存在笛卡尔积。 对于数组字段(转换),它的行为就像这样,而我对简单字段(如标题或年份)没有问题。

我也尝试过使用嵌套聚合,但可能不正确,ElasticSearch 抛出错误提示 casting.category 不是嵌套字段。

有什么想法吗?

Elasticsearch 会将嵌套对象展平,因此在内部您将得到:

{  
"title":"The Judge",
"year":2014,
"casting.name": ["Robert Downey Jr.","Robert Duvall"],
"casting.category": ["Producer", "Actor"]
}

如果您想保持关系,您需要使用 nested objects or a parent child relationship

要进行嵌套映射,您需要执行如下操作:

  "mappings": {
    "movies": {
      "properties": {
        "title" : { "type": "string" },
        "year" : { "type": "integer" },
        "casting": {
          "type": "nested", 
          "properties": {
            "name":    { "type": "string" },
            "category": { "type": "string" }
          }
        }
      }
    }
  }