То, что вы наблюдаете, - это, скорее всего, нормальное поведение агрегации terms
, поскольку количество документов приблизительное .Это не относится ни к reverse_nested
, ни к nested
агрегатам.
Короче говоря, поскольку данные распределяются по осколкам, Elasticsearch делает наилучшие предположения сначала локально для каждого осколка, а затем объединяет результат по осколкам.Для лучшего, более подробного объяснения, пожалуйста, посмотрите этот раздел документации .
Чтобы убедиться, что это действительно так, вы можете добавить агрегацию top_hits
с включенным explain
:
"aggs": {
"noOfParents": {
"reverse_nested": {},
"aggs": {
"top hits": {
"top_hits": {
"size": 10,
"explain": true
}
}
}
}
}
Это даст вам список совпавших родительских документов с их идентификационными номерами.Примерно так:
"aggregations": {
"mainGrouping": {
...
"groupBy": {
...
"buckets": [
{
"key": "1",
"doc_count": 5,
"noOfParents": {
"doc_count": 5,
"top hits": {
"hits": {
"total": 5,
"max_score": 1,
"hits": [
{
"_shard": "[my-index-2018-12][0]", <-- this is the shard
"_node": "7JNqOhTtROqzQR9QBUENcg",
"_index": "my-index-2018-12",
"_type": "doc",
"_id": "AWdpyZ4Y3HZjlM-Ibd7O",
"_score": 1,
"_source": {
"parent": "A",
"child": {
"id": "1"
}
},
"_explanation": ...
},
Еще один способ доказать, что это является источником проблемы, - изолировать запрос в пределах одного сегмента.Для этого достаточно добавить маршрутизацию к поисковому запросу: ?routing=0
Это сделает ваши подсчеты terms
ведра стабильными в пределах одного шарда.Затем сравните noOfParents
с ожидаемым количеством родителей (опять же, в пределах одного и того же шарда).
Надеюсь, это поможет!