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

如何按结果中的字段对一组bucket进行排序

凤经国
2023-03-14

我需要按字段“priority”(定义为文本)对bucket进行排序,但我不知道该怎么做。

你介意帮我做这件事吗?

我尝试过bucket_sort,但ES给出了一个关于类型的错误,与sort和order相同。

这是聚合查询

{
 "query": {
   [...]
  },
  "sort": [
    {
      "priority.keyword": {
        "order": "asc"
      }
    }
  ],
  "aggregations": {
    "by_family": {
      "terms": {
        "field": "familyId",
        "size": 25,
        "min_doc_count": 1,
        "shard_min_doc_count": 0,
        "show_term_doc_count_error": false,
        "order": [
          {
            "_count": "desc"
          },
          {
            "_key": "asc"
          }
        ]
      },
      "aggregations": {
        "same_family": {
          "top_hits": {
            "from": 0,
            "size": 1,
            "version": false,
            "explain": false,
            "highlight": {
              "pre_tags": [
                "<search>"
              ],
              "post_tags": [
                "</search>"
              ],
              "fields": {
                "title*": {
                  "type": "unified"
                }
                }
              }
            }
          }
        }
      }
    }
  }

结果示例如下:

{
  "responses" : [
    {
      "took" : 13117,
      "timed_out" : false,
      "_shards" : {
        "total" : 10,
        "successful" : 10,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 1754299,
        "max_score" : null,
        "hits" : [...]
      },
      "aggregations" : {
        "by_family" : {
          "doc_count_error_upper_bound" : 40,
          "sum_other_doc_count" : 1753462,
          "buckets" : [
            {
              "key" : 39031576,
              "doc_count" : 92,
              "same_family" : {
                "hits" : {
                  "total" : 92,
                  "max_score" : 10.636923,
                  "hits" : [
                    {
                      "_index" : "idx5-1554993721115",
                      "_type" : "_doc",
                      "_id" : "589403A-333506350",
                      "_score" : 10.636923,
                      "_source" : {
                        "number" : "589403A",
                        "suggest" : {
                          "input" : [
                            "589403A"
                          ]
                        },
                        "id" : "589403A-333506350",
                        "familyRepresentative" : 1,
                        "familyId" : 39031576,
                        "countryCode" : "NZ",
                        "number" : "589403",
                        "kind" : "A",
                        "family" : [ ],
                        "priority" : "20070425", <-------------
                        "created" : "2019-04-14",
                        "modified" : null,
                        "title" : [...],

我想按索引中定义为文本的字段“优先级”对存储桶聚合(asc/desc)进行排序

共有2个答案

陆翰藻
2023-03-14

为了简单起见,让我们试试这个:

'aggs' => [
    'by_family' => [
        'terms' => [
            'field' => 'familyId',
            'order' => [ '_term' => 'asc' ]
        ],
    ],
]

上面的脚本将关注您的< code>familyId字段,然后您可以将那里的< code>_term的值更改为< code>asc或< code>desc以相应地更改顺序

杨晓博
2023-03-14

您需要定义另一个子聚合(如最大值或最小值,取决于您想要如何排序),然后按该指标对父术语聚合进行排序。请记住,在按familyId排序的存储桶中,文档可能都有不同的优先级字段值,因此在给定文档字段上对存储桶进行排序没有意义,只能对该给定字段的聚合值进行排序。

{
 "query": {
   [...]
  },
  "sort": [
    {
      "priority.keyword": {
        "order": "asc"
      }
    }
  ],
  "aggregations": {
    "by_family": {
      "terms": {
        "field": "familyId",
        "size": 25,
        "min_doc_count": 1,
        "shard_min_doc_count": 0,
        "show_term_doc_count_error": false,
        "order": [
          {
            "max_priority": "desc"
          }
        ]
      },
      "aggregations": {
        "max_priority": {
          "max": {
              "script": "Long.parseLong(doc['priority.keyword'].value)"
          }  
        }
      }
    }
  }
 类似资料:
  • 问题内容: 如何按其字段之一(例如或)对对象数组进行排序? 问题答案: 使用usort,这是从手册改编而成的示例: 您还可以将任何callable用作第二个参数。这里有些例子: 使用匿名函数(来自PHP 5.3) 从班级内部 使用箭头函数(来自PHP 7.4) 另外,如果要比较数字值,则应使用“比较”功能。

  • 我目前有一个查询,它使用MongoTemplate的findAll()方法返回集合中的所有文档。我想对这些结果进行排序,但看不到任何方法。我看到我可以使用find()和一个查询参数并调用。with(Sort Sort),但是在这个场景中,我如何设置查询以返回所有文档?我会同意使用任何一种方法。

  • 问题内容: 正在搜寻 这不起作用....我到处搜索并阅读了文档。但是我只是看不到如何根据他们的“所有者”关系名称对我的(基础)查询进行排序。 它总是导致: 这一定很容易…但是我看不到。还研究了比较器,这似乎合乎逻辑,但是我看不到ORDER BY的查询部分在哪里生成或我应该返回什么,因为所有内容都是动态生成的。为每个“玩家”关系做一个比较器来做一件简单的事情似乎过于复杂。 问题答案: SQLAlch

  • 问题内容: 我有这样的数组 如何按return_fare asc和one_way_fare asc排序值? 我尝试了array_multisort()但最终却得到了混乱的数据。 Asort仅适用于一维数组,我需要按两个或多个值进行排序,我如何才能像SQL中那样实现此功能,按field1 asc,field2 asc排序? 问题答案: 是正确的函数,您必须以某种方式搞砸了: 如果您在PHP的手册页上

  • 我有一个包含下一个数据的ArrayList:(int)、(int)、(int)、(String)。我按字段对此数组进行排序。如果长度与提交的相等,我如何赋予优先级(优先级将具有具有水平位置的长度)。例如,给定输入: 输出应为: 以下是我所拥有的:

  • 问题内容: 我有一些文档有两个字段:文本,计数。 我曾经为文档编制索引,现在我想在文本中搜索并按降序将结果按计数排序。我怎样才能做到这一点? 问题答案: Apache Lucene的默认搜索实现返回按分数(最相关的结果排在最前),然后按ID(最旧的结果排在前)的结果。 可以在查询时使用附加的Sort参数自定义此行为。 TopFieldDocs Searcher#search(查询查询,过滤器过滤器