首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按内部多桶聚合中的源字段对多桶聚合进行排序。

按内部多桶聚合中的源字段对多桶聚合进行排序。
EN

Stack Overflow用户
提问于 2020-01-10 15:34:23
回答 1查看 384关注 0票数 2

TL;DR:在外部多桶聚合中使用内部多桶聚合(__top_hits with size: 1__),可以根据内部桶中的数据对外部聚合的桶进行排序吗?

我有以下的索引映射

代码语言:javascript
复制
{
  "parent": {
    "properties": {
      "children": {
        "type": "nested",
        "properties": {
          "child_id": { "type": "keyword" }
        }
      }
    }
  }
}

每个子(在数据中)还具有属性last_modified: Dateother_property: String

我需要获取一个孩子的列表(包括所有的父母,但没有父母),但是只有一个每个child_id都有最新的child_id。然后,我需要对这些结果进行排序和分页,以返回可管理的数据量。

我可以使用nestedtermstop_hitsbucket_sort聚合来获取数据并对其进行分页(还可以使用cardinality获得总计数)。

代码语言:javascript
复制
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "children": {
        "nested": {
            "path": "children"
        },
        "aggs": {
            "totalCount": {
                "cardinality": {
                    "field": "children.child_id"
                }
            },
            "oneChildPerId": {
                "terms": {
                    "field": "children.child_id",
                    "order": { "_term": "asc" },
                    "size": 1000000
                },
                "aggs": {
                    "lastModified": {
                        "top_hits": {
                            "_source": [
                                "children.other_property"
                            ],
                            "sort": {
                                "children.last_modified": {
                                    "order": "desc"
                                }
                            },
                            "size": 1
                        }
                    },
                    "paginate": {
                        "bucket_sort": {
                            "from": 36,
                            "size": 3
                        }
                    }
                }
            }
        }
    }
  }
}

但是,经过整整一天的浏览和实验,我似乎还没有弄清楚,如何通过oneChildPerId聚合检索到的单个子程序的other_property来排序我的lastModified聚合的桶。

是否有一种方法可以根据嵌套多桶聚合的结果对多桶聚合进行排序?

我试过的是:

  • 我认为我也可以使用bucket_sort,但是很明显,它的sort只能用于包含其他单桶聚合的路径,并且以一个单桶聚合结尾。
  • ,我一直试图找到一种方法,以某种方式将1-结果的多桶lastModified转化为单桶,但还没有找到任何。

我使用的是ElasticSearch 6.8.6 ( ES 5.x和更高版本中没有bucket_sort和类似的工具)。

EN

回答 1

Stack Overflow用户

发布于 2022-05-11 13:07:52

我也有同样的问题。我需要一个带有嵌套termstop_hits聚合,并希望按照嵌套聚合中的特定字段进行排序。

不确定我的解决方案的性能如何,但所需的行为可以通过与top_hits相同级别上的单值度量聚合来实现。然后,可以在terms聚合中使用order字段对新的聚合进行排序。

这里有一个例子:

代码语言:javascript
复制
POST books/_doc 
{ "genre": "action", "title": "bookA", "pages": 200 }
POST books/_doc 
{ "genre": "action", "title": "bookB", "pages": 35 }
POST books/_doc 
{ "genre": "action", "title": "bookC", "pages": 170 }
POST books/_doc 
{ "genre": "comedy", "title": "bookD", "pages": 80 }
POST books/_doc 
{ "genre": "comedy", "title": "bookE", "pages": 90 }

GET books/_search
{
  "size": 0,
  "aggs": {
    "by_genre": {
      "terms": {
        "field": "genre.keyword",
        "order": {"max_pages": "asc"}
      },
      "aggs": {
        "top_book": {
          "top_hits": {
            "size": 1,
            "sort": [{"pages": {"order": "desc"}}]
          }
        },
        "max_pages": {"max": {"field": "pages"}}
      }
    }
  }
}

by_genre有一个名为max_pages的子聚合排序的order字段。仅为此目的添加了max_pages。它创建了一个单值度量,通过它可以对订单进行排序。

上面的查询返回(为了清晰起见,我缩短了输出):

代码语言:javascript
复制
{ "genre" : "comedy", "title" : "bookE", "pages" : 90 }
{ "genre" : "action", "title" : "bookA", "pages" : 200 }

如果将"order": {"max_pages": "asc"}更改为"order": {"max_pages": "desc"},则输出如下:

代码语言:javascript
复制
{ "genre" : "action", "title" : "bookA", "pages" : 200 }
{ "genre" : "comedy", "title" : "bookE", "pages" : 90 }

max_pages聚合的类型可以根据需要进行更改,只要它是一个单值metic聚合(例如sum、avg等)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59684670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档