我有以下两个文件:
{
"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不是嵌套字段。
这里有什么想法吗?
答案 0 :(得分:2)
Elasticsearch将展平嵌套对象,因此您将在内部得到:
{
"title":"The Judge",
"year":2014,
"casting.name": ["Robert Downey Jr.","Robert Duvall"],
"casting.category": ["Producer", "Actor"]
}
如果您想保持关系,则需要使用nested objects或parent child relationship
要进行嵌套映射,您需要执行以下操作:
"mappings": {
"movies": {
"properties": {
"title" : { "type": "string" },
"year" : { "type": "integer" },
"casting": {
"type": "nested",
"properties": {
"name": { "type": "string" },
"category": { "type": "string" }
}
}
}
}
}