2015-01-05 36 views
3

我有以下两个文件:ElasticSearch - 问题与子项的聚集与数组字段

{ 
"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.category。

我尝试使用基于casting.name字段的TermsAggregation,并使用subaggregation,这是另一个基于casting.category字段的TermsAggregation。

问题是,对于“克里斯埃文斯”条目,ElasticSearch为所有类别(Actor,Producer)设置存储桶,而它应该只设置1个存储桶(Actor)。

似乎在所有casting.category事件和所有casting.name事件之间存在笛卡尔积。 它的行为像数组字段(铸造),而我没有问题与简单的领域(如标题或年份)。

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

这里的任何想法?

回答

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" } 
      } 
     } 
     } 
    } 
    } 
+0

好吧,这是伟大的,谢谢澄清! – julien

+0

这太棒了 - 很高兴我能帮上忙。你能接受答案吗? –