2015-05-18 88 views
0

我有一個產品存儲庫映射:ElasticSearch總嵌套領域

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 
    }, ] 
}, 
... 
] 

規格和值應該由數進行排序。

我需要使用什麼類型的聚合?

回答

0

您要使用的nested聚集(因爲spec_entriesnested類型,然後一個terms聚合爲spec_entries.nametop_hits子聚集讓高層嵌套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聚合的子聚合的聚合將僅適用於from ES 1.5 onward

+0

好的,但是spec id,value id和規格說明呢? –