Elasticsearch:关于嵌套Sum聚合的排序

时间:2017-04-10 12:53:32

标签: sorting elasticsearch aggregate-functions

用例是创建聚合,以查找按销售产品数量排序的区域中的畅销产品。数据存储在elasticsearch中的索引中。

我想通过sum_quantity值聚合对我的'group_by_name'聚合输出进行排序,该聚合位于'group_by_name'之后的最后一个嵌套聚合/两个级别中,具有中间聚合'group_by_sku'。默认输出按doc_count排序。我希望聚合按'sum_quantity'聚合值排序。

我有一个索引,其中包含以下映射:

{"settings": {
"index": {
  "number_of_shards": 2,
  "number_of_replicas": 0
},
"analysis":{
  "analyzer":{
    "autocomplete":{
      "type":"custom",
      "tokenizer":"standard",
      "filter":[ "standard", "lowercase", "ngram" ] 
    }
  },
  "filter":{
    "ngram":{
      "type":"ngram",
      "min_gram":3,
      "max_gram":25
    }
  }
} },"mappings": {
"farmer_products_map":{
  "properties": { 
  "state": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      },
  "district": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      },
  "taluka": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      },
    "village": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      },
  "createdOn": { 
    "type": "date",
    "format": "epoch_millis"
  },
  "category": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
      }
  },
   "brand": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
      }
  },
   "productName": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          },
          "autocomplete":{
            "analyzer": "autocomplete",
            "type": "string"
          }
      }
  },
   "crop": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
      }
  },
  "sku": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
      }
  },
  "quantity": {
        "type": "integer"
      },

"farmerId": {
        "type": "integer"
      },
"orderId": {
        "type": "integer"
      }
}} }}

以下是示例文件:

[{
"_index": "farmer_products_index_adv",
"_type": "farmer_products_map",
"_id": "AVtCttf0IP9v8cUTtoiz",
"_score": 1,
"_source": {
    "orderId": 469173,
    "category": "Hardware",
    "farmerId": 509583,
    "district": "",
    "brand": "Honda",
    "taluka": "",
    "crop": "",
    "productName": "Honda BRUSH CUTTER UMK 435-T U2NT",
    "state": "",
    "sku": "AGS-HW-471",
    "village": "",
    "quantity": 1
},{
"_index": "farmer_products_index_adv",
"_type": "farmer_products_map",
"_id": "AVtCttf0IP9v8cUTtoi1",
"_score": 1,
"_source": {
    "orderId": 469177,
    "category": "Crop Nutrition",
    "farmerId": 13732,
    "district": "Banaskantha",
    "brand": "Unassigned Brand",
    "taluka": "Kankrej",
    "crop": "",
    "productName": "Free Power Gel - Plant Nutrient (500 Ml)",
    "state": "Gujarat",
    "sku": "AGS-CN-006",
    "village": "Nanota",
    "quantity": 1
}}]

我希望执行以下查询聚合:

{
"query": {
    "bool": {
        "must": [{
            "match": {
                "state": {
                    "query": "Maharashtra",
                    "fuzziness": 3,
                    "prefix_length": 2
                }

            }
        }, {
            "match": {
                "district": {
                    "query": "Wardha",
                    "fuzziness": 3,
                    "prefix_length": 2
                }

            }
        }, {
            "match": {
                "taluka": {
                    "query": "Wardha",
                    "fuzziness": 3,
                    "prefix_length": 2
                }

            }
        }]
    }
},
"size": 0,
"aggs": {
    "group_by_state": {
        "terms": {
            "field": "state.keyword"
        },
        "aggs": {
            "group_by_district": {
                "terms": {
                    "field": "district.keyword"
                },
                "aggs": {
                    "group_by_taluka": {
                        "terms": {
                            "field": "taluka.keyword"

                        },
                        "aggs": {
                            "group_by_name": {
                                "terms": {
                                    "field": "productName.keyword"
                                },
                                "aggs": {
                                    "group_by_sku": {
                                        "terms": {
                                            "field": "sku.keyword"
                                        },
                                        "aggs": {

                                            "sum_quantity": {
                                                "sum": {
                                                    "field": "quantity"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}}

聚合的当前输出是:

[{
"key": "Free MH HDPE Tarpaulin Tape Black 3mtr roll",
"doc_count": 13,
"group_by_sku": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [{
        "key": "AGS-HW-410",
        "doc_count": 13,
        "sum_quantity": {
            "value": 13
        }
    }]}}, {
"key": "Tarpaulin Sheet 11*15 (Tadpatri) 250 GSM",
"doc_count": 10,
"group_by_sku": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [{
        "key": "AGS-HW-326",
        "doc_count": 10,
        "sum_quantity": {
            "value": 10
        }
    }]
}}, {
"key": "Free Humic power Advanced powder 95% (250 Gms)",
"doc_count": 6,
"group_by_sku": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [{
        "key": "AGS-CN-036",
        "doc_count": 6,
        "sum_quantity": {
            "value": 18
        }
    }]
}}]

我希望输出按sum_quantity值排序:

[{
"key": "Free Humic power Advanced powder 95% (250 Gms)",
"doc_count": 6,
"group_by_sku": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [{
        "key": "AGS-CN-036",
        "doc_count": 6,
        "sum_quantity": {
            "value": 18
        }
    }]}}, {
"key": "Free MH HDPE Tarpaulin Tape Black 3mtr roll",
"doc_count": 13,
"group_by_sku": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [{
        "key": "AGS-HW-410",
        "doc_count": 13,
        "sum_quantity": {
            "value": 13
        }
    }]
}}, {
"key": "Tarpaulin Sheet 11*15 (Tadpatri) 250 GSM",
"doc_count": 10,
"group_by_sku": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [{
        "key": "AGS-HW-326",
        "doc_count": 10,
        "sum_quantity": {
            "value": 10
        }
    }]
}}]

我怎样才能做到这一点?我尝试使用“reverse_nested”在其他stackoverflow问题中建议的方法,但无法找到解决方案。

0 个答案:

没有答案