一尘不染

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

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.name和casting.category。

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

问题在于,对于“ Chris Evans”条目,ElasticSearch为所有类别(演员,生产者)设置了存储桶,而应仅设置1个桶(演员)。

似乎所有casting.category事件与所有casting.name事件之间都存在笛卡尔积。对于数组字段(广播),它的行为类似于此,而对于简单字段(如标题或年份),我没有问题。

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

这里有什么主意吗?


阅读 296

收藏
2020-06-22

共1个答案

一尘不染

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" }
          }
        }
      }
    }
  }
2020-06-22