Не правильная работа terminate_after

Добрый день.
Столкнулся с проблемой в использовании terminate_after. Мы работаем с индексом в 4 миллиарда документов, состоит из 200 шардов, судя по документации эластика terminate_after применяется к каждому шарду, установив terminate_after = 500 000, я расчитываю на то что прерываение произойдет когда количество документов в запросе будет больше 100 миллионов. На практике если запрос с количеством больше 100 миллионов документов то прерывание происходит так как надо, но в моем случае я столкнулся с тем, когда документов меньше 100 миллионов, также происходит прерываение, начиная с запросов у которых от 93 миллионов результатов. В чем может быть проблема? Я пока не могу понять это баг или нормально поведение эластика, ответа нигде не могу найти. Спасибо за помощь.

{
	"query": {
		"bool": {
			"should": [
				{
					"match": {
						"name": {
							"boost": 1000,
							"query": "g"
						}
					}
				},
				{
					"prefix": {
						"name_full_reverse": {
							"boost": 100,
							"value": "g"
						}
					}
				},
				{
					"multi_match": {
						"fields": [],
						"query": "g"
					}
				}
			]
		}
	}
}

/_count?terminate_after=500000
{
  "terminated_early": true,
  "count": 93705326,
  "_shards": {
    "total": 200,
    "successful": 200,
    "skipped": 0,
    "failed": 0
  }
}

/_count
{
  "count": 98221798,
  "_shards": {
    "total": 200,
    "successful": 200,
    "skipped": 0,
    "failed": 0
  }
}

Как вы правильно отметили:

Однако, ваше убеждение

базируется на не правильном предположении, что каждая шарда вернет вам одинаковое количество документов. На самом деле, эти 93 миллиона, скорее всего распределены не равномерно.

Например, если у вас 100 шард находят 505,000 документов и останавливаются на 500,000, а другие 100 шард находят 450,000, то результат будет - 500,000 * 100 + 450,000 * 100 = 95,000,000.

Спасибо за ответ, это все объясняет.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.