TL;DR:在外部多桶聚合中使用内部多桶聚合(__top_hits with size: 1__),可以根据内部桶中的数据对外部聚合的桶进行排序吗?
我有以下的索引映射
{
"parent": {
"properties": {
"children": {
"type": "nested",
"properties": {
"child_id": { "type": "keyword" }
}
}
}
}
}每个子(在数据中)还具有属性last_modified: Date和other_property: String。
我需要获取一个孩子的列表(包括所有的父母,但没有父母),但是只有一个每个child_id都有最新的child_id。然后,我需要对这些结果进行排序和分页,以返回可管理的数据量。
我可以使用nested、terms、top_hits和bucket_sort聚合来获取数据并对其进行分页(还可以使用cardinality获得总计数)。
{
"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只能用于包含其他单桶聚合的路径,并且以一个单桶聚合结尾。lastModified转化为单桶,但还没有找到任何。我使用的是ElasticSearch 6.8.6 ( ES 5.x和更高版本中没有bucket_sort和类似的工具)。
发布于 2022-05-11 13:07:52
我也有同样的问题。我需要一个带有嵌套terms的top_hits聚合,并希望按照嵌套聚合中的特定字段进行排序。
不确定我的解决方案的性能如何,但所需的行为可以通过与top_hits相同级别上的单值度量聚合来实现。然后,可以在terms聚合中使用order字段对新的聚合进行排序。
这里有一个例子:
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。它创建了一个单值度量,通过它可以对订单进行排序。
上面的查询返回(为了清晰起见,我缩短了输出):
{ "genre" : "comedy", "title" : "bookE", "pages" : 90 }
{ "genre" : "action", "title" : "bookA", "pages" : 200 }如果将"order": {"max_pages": "asc"}更改为"order": {"max_pages": "desc"},则输出如下:
{ "genre" : "action", "title" : "bookA", "pages" : 200 }
{ "genre" : "comedy", "title" : "bookE", "pages" : 90 }max_pages聚合的类型可以根据需要进行更改,只要它是一个单值metic聚合(例如sum、avg等)。
https://stackoverflow.com/questions/59684670
复制相似问题