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

时间:2015-01-05 09:18:51

标签: elasticsearch aggregation term

我有以下两个文件:

{  
"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为所有类别(Actor,Producer)设置存储桶,而它应该只设置1个存储桶(Actor)。

似乎所有casting.category出现和所有casting.name出现之间都存在笛卡尔积。 它的行为与数组字段(强制转换)相似,而我没有简单字段(标题或年份)的问题。

我也尝试使用嵌套聚合,但可能不正确,并且ElasticSearch会抛出一个错误,告知casting.category不是嵌套字段。

这里有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

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

如果您想保持关系,则需要使用nested objectsparent child relationship

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

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