当前位置: 首页 > 知识库问答 >
问题:

排序elasticsearch范围聚合

华飞驰
2023-03-14

是否可以在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个答案

司徒胤
2023-03-14

通常,您可以使用bucket\u排序聚合。然后,您可以按键、计数或子聚合(即按为每个存储桶计算的度量)进行排序。

考虑到您只有三个固定的bucket,我只需要在客户端进行排序。

司徒修能
2023-03-14

由于按键似乎是根据“从”值的升序值排序的,因此您可以稍微“欺骗”一下,将“全部”存储桶的“从”值修改为-1,然后“全部”存储桶将首先出现,然后将“从”值修改为10,最后将“从”值修改为11:

POST /docs/_search
{
   "size": 0,
   "aggs": {
      "price_ranges": {
         "range": {
            "field": "price",
            "keyed": true,
            "ranges": [
               {
                  "key": "all",
                  "from": -1
               },
               {
                  "key": "to10",
                  "from": 0,
                  "to": 10
               },
               {
                  "key": "from11",
                  "from": 11
               }
            ]
         }
      }
   }
}
 类似资料:
  • 在elasticsearch中,是否有方法使用自定义分数对聚合桶进行排序/排序? 我正在按客户姓名进行扣球。每个客户都有多个订单,其中有一个交货日期字段(DeliveDate)。我想根据与当前日期的距离(接近程度)对桶进行排序。 例如,对交货日期更接近今天日期的客户名进行排序。 非常感谢。

  • 我们目前正在开发一个多语言文档CMS。因此,我们有翻译成不同语言的文件。 对于使用Elasticsearch进行搜索,我们目前使用每种语言(德语、英语、法语……)一个索引,其中同一文档的所有翻译共享相同的ID。 当用户搜索特定术语时,我们希望在所有语言中搜索,但只返回不同ID的列表。据我所知,只有使用以下术语聚合才能做到这一点: 这很好,但是作为弹性搜索文档https://www.elastic.

  • 问题内容: 我有这种结构的文档: 我想对FIELD2.SUBFIELDs中的数字总和的结果进行排序: 如果这样做,我将获得未排序的存储桶,但是我希望存储桶按“ a2”值进行排序。我该怎么做?谢谢! 问题答案: 你差点就吃了。你只需要一个添加属性到你的条件聚合,是这样的:

  • 我正在对文档中的“位置”字段进行聚合,在同一文档中还有一个“城市”字段。我正在查询“城市”字段上的文档,并聚合“位置”字段上的文档。 现在计数和聚合都很好,随着hits.but我的问题是,我想在“doc-count”设置为0的情况下进行聚合,聚合桶会返回所有计数为0的lcoations,这些lcoations甚至落在其他城市。我只想获得0个计数位置,只是为了city.want将0个计数位置的上下文

  • **我试图聚合和找到价格范围,如果在基础上的嵌套报价数组(嵌套数组)的sellerInfoES对象。内部字段是"offerPrice"。如何在Elasticsearch中的嵌套数组字段上编写聚合。我尝试了以下查询,但它不工作。获取此错误:解析失败[在[price_ranges]中找到两个聚合类型定义:[嵌套]和[过滤器]] 映射: 查询:

  • 问题内容: **如果要基于SellerInfoES的嵌套要约价格数组(嵌套数组)对象,我正在尝试汇总和查找价格范围。内部字段是“ offerPrice”。我如何在Elasticsearch中的嵌套数组字段上编写聚合。我尝试了以下查询,但无法正常工作。收到此错误:解析失败[在[price_ranges]中找到了两个聚合类型定义:[嵌套]和[过滤器]] 对应: 查询: 问题答案: 您必须使用。在内部使