[英]ElasticSearch aggregate nested fields
我有一個帶有映射的產品存儲庫:
settings do
mapping do
indexes :name
indexes :vendor_id, type: 'integer'
indexes :category_id, type: 'integer'
indexes :spec_entries, type: 'nested' do
indexes :spec_id, type: 'integer'
indexes :value_id, type: 'integer'
indexes :name, index: 'no'
indexes :description, index: 'no'
indexes :value, index: 'no'
end
end
end
規格條目是產品規格(例如:貨叉:空氣),其中貨叉是名稱,航空是值。 另外還有規格ID,規格值ID和規格說明。
我需要這樣的聚合結果:
[
...
{
id: 335,
name: "Fork",
description: "There are few common types of fork — elastomer, oil and air",
count: 30,
values: [{
id: 645,
name: "Elastomer",
count: 17
}, {
id: 643,
name: "Oil",
count: 10
}, {
id: 649,
name: "Air",
count: 3
}, ]
},
...
]
規格和值應按計數排序。
我需要使用哪種類型的聚合?
您想使用nested
聚合(因為spec_entries
具有nested
類型,然后為spec_entries.name
和top_hits
子聚合使用一個terms
聚合來獲得頂部的嵌套spec_entries
。應執行以下操作:
{
"query": {
"match_all": {}
},
"aggs": {
"spec_names": {
"nested": {
"path": "spec_entries"
},
"aggs": {
"names": {
"terms": {
"field": "spec_entries.name"
},
"aggs": {
"top_entries": {
"top_hits": {
"field": "spec_entries.value"
}
}
}
}
}
}
}
}
這將產生非常接近您期望的結果:
{
...
"aggregations" : {
"spec_names" : {
"doc_count" : 1,
"names" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [ {
"key" : "fork", <-------- The spec_entries name
"doc_count" : 1,
"top_values" : {
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "tests",
"_type" : "test1",
"_id" : "1",
"_nested" : {
"field" : "spec_entries",
"offset" : 0
},
"_score" : 1.0,
"_source":{ <-------- For each name, the top spec_entries content (value, id, desc, etc)
"name":"Fork",
"value":"Air",
"description":"desc",
"spec_id":1,
"value_id":1
}
} ]
}
}
} ]
}
}
}
}
請注意,使用top_hits
聚合作為nested
聚合的子聚合只能從ES 1.5開始使用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.