簡體   English   中英

ElasticSearch聚合嵌套字段

[英]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.nametop_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM