我有以下两个文件:
{ "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。
我尝试使用基于Cast.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"] }
如果要保留关系,则需要使用嵌套对象或父子关系
要进行嵌套映射,您需要执行以下操作:
"mappings": { "movies": { "properties": { "title" : { "type": "string" }, "year" : { "type": "integer" }, "casting": { "type": "nested", "properties": { "name": { "type": "string" }, "category": { "type": "string" } } } } } }