【问题标题】:ElasticSearch aggregate nested fieldsElasticSearch 聚合嵌套字段
【发布时间】:2015-07-30 09:04:20
【问题描述】:

我有一个带有映射的产品存储库:

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

规格条目是产品规格(例如:Fork:Air),其中 Fork 是名称,Air 是值。还有规格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
  }, ]
},
...
]

规格和值应按数量排序。

我需要使用什么类型的聚合?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您想使用nested 聚合(因为spec_entries 具有nested 类型,然后是spec_entries.name 的一个terms 聚合和一个top_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

    【讨论】:

    • 好的,但是规范 ID、值 ID 和规范描述呢?
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 2018-06-01
    • 2020-12-21
    • 2021-12-14
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多