对elasticsearch Range Aggregation进行排序

时间:2016-01-08 13:55:21

标签: elasticsearch aggregation

是否可以更改elasticsearch中范围聚合的结果排序?我在elasticsearch中有一个键控范围查询,并希望根据键而不是doc_count进行排序。

我的文件是:

POST /docs/doc/1
{
    "price": 12
}

POST /docs/doc/2
{
    "price": 8
}

POST /docs/doc/3
{
    "price": 15
}

汇总查询:

POST /docs/_search
{
   "size": 0,
   "aggs": {
      "price_ranges": {
         "range": {
            "field": "price",
            "keyed": true,
            "ranges": [
               {
                  "key": "all",
                  "from": 0
               },
               {
                  "key": "to10",
                  "from": 0,
                  "to": 10
               },
               {
                  "key": "from11",
                  "from": 11
               }
            ]
         }
      }
   }
}

此查询的结果为:

"aggregations": {
   "price_ranges": {
      "buckets": {
         "to10": {
            "from": 0,
            "from_as_string": "0.0",
            "to": 10,
            "to_as_string": "10.0",
            "doc_count": 2
         },
         "all": {
            "from": 0,
            "from_as_string": "0.0",
            "doc_count": 4
         },
         "from11": {
            "from": 11,
            "from_as_string": "11.0",
            "doc_count": 2
         }
      }
   }
}

我想根据键对结果进行排序,而不是根据范围值。根据elasticsearch文档,无法指定排序顺序,在指定排序顺序时,我得到以下异常:

"reason": "Unknown key for a START_ARRAY in [price_ranges]: [order]."

有关如何应对此问题的任何想法?谢谢!

2 个答案:

答案 0 :(得分:1)

由于键似乎是根据DatePickerDialogFragment值的升序值排序的,因此您可以“作弊”一点并将from桶的from值修改为 - 1,然后all广告资源首先显示,然后all,最后显示to10

from11

答案 1 :(得分:0)

一般情况下,您可以使用bucket_sort aggregation。然后,您可以按_key_count或子聚合(即按每个存储桶计算的指标)进行排序。

鉴于你只有三个固定存储桶,我只是在客户端进行排序。

相关问题