2015-01-05 54 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

這太棒了 - 很高興我能幫上忙。你能接受答案嗎? –