这个
composite
aggregation
这可能会有所帮助,因为它允许您按多个字段分组,然后在结果上分页。它不允许您做的唯一事情是跳转到给定的偏移量,但是如果有必要的话,可以通过从客户机代码迭代来完成。
下面是一个示例查询:
POST testindex6/_search
{
"size": 0,
"aggs": {
"my_buckets": {
"composite": {
"size": 100,
"sources": [
{
"store": {
"terms": {
"field": "store_url"
}
}
},
{
"status": {
"terms": {
"field": "status",
"order": "desc"
}
}
},
{
"title": {
"terms": {
"field": "title",
"order": "asc"
}
}
}
]
},
"aggs": {
"hits": {
"top_hits": {
"size": 100
}
}
}
}
}
}
在回应中你会看到
after_key
结构:
"after_key": {
"store": "http://google.com1087",
"status": "OK1087",
"title": "Titanic1087"
},
它是一种游标,需要在后续查询中使用,例如:
{
"size": 0,
"aggs": {
"my_buckets": {
"composite": {
"size": 100,
"sources": [
{
"store": {
"terms": {
"field": "store_url"
}
}
},
{
"status": {
"terms": {
"field": "status",
"order": "desc"
}
}
},
{
"title": {
"terms": {
"field": "title",
"order": "asc"
}
}
}
],
"after": {
"store": "http://google.com1087",
"status": "OK1087",
"title": "Titanic1087"
}
},
"aggs": {
"hits": {
"top_hits": {
"size": 100
}
}
}
}
}
}
它会给你接下来的100桶。希望这能有所帮助。
更新
:
"aggs": {
"my_buckets": {
"composite": {
...
}
},
"store_cardinality": {
"cardinality": {
"field": "store_url"
}
},
"status_cardinality": {
"cardinality": {
"field": "status"
}
},
"title_cardinality": {
"cardinality": {
"field": "title"
}
}
}
然后我们可以通过乘以我们得到的数据得到桶的总数
store_cardinality
,
status_cardinality
和
title_cardinality
一起,或者至少
good approximation thereof
(它在高基数字段上不起作用,但在低基数字段上效果很好)。