Здесь может помочь composite
агрегация , поскольку она позволяет группировать по нескольким полям и разбивать результаты на страницы.Единственное, что он не позволяет вам сделать, - это перейти с заданным смещением, но вы можете сделать это, перебирая код своего клиента, если это вообще необходимо.
Так вот пример запроса для этого:
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 ведер.Надеюсь, это поможет.
ОБНОВЛЕНИЕ :
Если вы хотите узнать, сколько будет общее количество сегментов, агрегация composite
не даст вамэтот номер.Однако, поскольку агрегация composite
является не чем иным, как декартовым произведением всех полей в ее источниках, вы можете получить хорошее приближение к этому общему числу, также возвращая] количество элементов] (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html) каждого поляиспользуется в агрегации composite
и умножении их вместе.
"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
вместе,или, по крайней мере, хорошего приближения к нему (это не будет хорошо работать на полях с большим количеством элементов, но довольно хорошо на полях с низким количеством элементов).