У меня есть вопрос об агрегации bucket_selector. (Протестированная среда: ES6.8 и ES7 basic на centos7)
В моем случае использования мне нужно отбросить документы, если есть ошибки в выбранном свойстве. Индекс не большой, около 2 млн записей. Запрос на поиск этих записей выглядит следующим образом:
GET index_id1/_search
{
"size": 0,
"aggs": {
"byNested": {
"nested": {
"path": "nestedObjects"
},
"aggs": {
"sameIds": {
"terms": {
"script": {
"lang": "painless",
"source": "return doc['nestedObjects.id'].value"
},
"size": 1000
},
"aggs": {
"byId": {
"reverse_nested": {}
},
"byId_bucket_filter": {
"bucket_selector": {
"buckets_path": {
"totalCount": "byId._count"
},
"script": {
"source": "params.totalCount > 1"
}
}
}
}
}
}
}
}
}
Я получаю ведра обратно. Но чтобы расслабить запрос и нагрузку. Я делаю это размером : 1000 . Итак, следующий запрос выдан, чтобы получить больше дупликов, пока не вернется ноль. Проблема, однако, - слишком небольшое количество обманщиков. Я проверил результат запроса, установив size: 2000000 :
GET index_id1/_search
{
"size": 0,
"aggs": {
"byNested": {
"nested": {
"path": "nestedObjects"
},
"aggs": {
"sameIds": {
"terms": {
"script": {
"lang": "painless",
"source": "return doc['nestedObjects.id'].value"
},
"size": 2000000 <-- too big
},
"aggs": {
"byId": {
"reverse_nested": {}
},
"byId_bucket_filter": {
"bucket_selector": {
"buckets_path": {
"totalCount": "byId._count"
},
"script": {
"source": "params.totalCount > 1"
}
}
}
}
}
}
}
}
}
Как я понимаю, первый шаг: он фактически создает сегменты, как указано в запросе, а затем фильтрует только bucket_selector. Что мне нужно. И именно поэтому я вижу такое поведение. Чтобы получить все сегменты, мне нужно настроить "search.max_buckets" на 2000000 .
Преобразовать в запрос с составной агрегацией:
GET index_id1/_search
{
"aggs": {
"byNested": {
"nested": {
"path": "nestedObjects"
},
"aggs": {
"compositeAgg": {
"composite": {
"after": {
"termsAgg": "03f10a7d-0162-4409-8647-c643274d6727"
},
"size": 1000,
"sources": [
{
"termsAgg": {
"terms": {
"script": {
"lang": "painless",
"source": "return doc['nestedObjects.id'].value"
}
}
}
}
]
},
"aggs": {
"byId": {
"reverse_nested": {}
},
"byId_bucket_filter": {
"bucket_selector": {
"script": {
"source": "params.totalCount > 1"
},
"buckets_path": {
"totalCount": "byId._count"
}
}
}
}
}
}
}
},
"size": 0
}
Как я понимаюон делает то же самое, за исключением того, что мне нужно сделать 2000 вызовов ( размер: 1000 каждый), чтобы просмотреть весь индекс. Композитный агг кэширует результаты или почему это лучше? Может быть, есть лучший подход в этом случае?