Сначала вам нужно в своем отображении указать, что индекс имеет вложенное поле, как показано ниже:
PUT /nested-index {
"mappings": {
"document": {
"properties": {
"project": {
"type": "nested",
"properties": {
"subject": {
"type": "keyword"
},
"marks": {
"type": "long"
}
}
}
}
}
}
}
, затем вставьте свои документы:
PUT nested-index/document/1
{
"project": [
{
"subject": "maths",
"marks": 47
},
{
"subject": "computers",
"marks": 22
}
]
}
, затем вставьте второй документ:
PUT nested-index/document/2
{
"project": [
{
"subject": "maths",
"marks": 65
},
{
"subject": "networks",
"marks": 72
}
]
}
и затем вы выполняете агрегацию, но указываете, что у вас есть вложенная структура, подобная этой:
GET nested-index/_search
{
"size": 0,
"aggs": {
"subjects": {
"nested": {
"path": "project"
},
"aggs": {
"subjects": {
"terms": {
"field": "project.subject",
"size": 10
},
"aggs": {
"average": {
"avg": {
"field": "project.marks"
}
}
}
}
}
}
}
}
, и почему ваш запрос не работает и почему вы даете такой результат, потому что, когда у вас есть вложенное полеи вычислите среднее значение, которое суммирует все числа из одного массива, если в этом массиве у вас есть какое-то ключевое слово, не имеет значения, что вы хотите агрегировать только по одному предмету.
Так что, если у вас есть эти два документа, потому что в обоих документах выу математического субъекта среднее значение будет вычислено следующим образом:
(47 + 22 + 65 + 72) / 4 = 51,5
если вы хотите получить среднее значение для сетей, оно вернет вас (потому что в одном документеу вас есть сеть, но она будет работать со всеми значениями в массиве):
65 + 72 = 68,5
, поэтому вам необходимо использовать вложенную структуру в этом случае.
ЕслиВы заинтересованы только для одного Subjт. д. Вы можете сделать агрегацию только для предмета, равного чему-то подобного (предмет, равный «математике»):
GET nested-index/_search
{
"size": 0,
"aggs": {
"project": {
"nested": {
"path": "project"
},
"aggs": {
"subjects": {
"filter": {
"term": {
"project.subject": "maths"
}
},
"aggs": {
"average": {
"avg": {
"field": "project.marks"
}
}
}
}
}
}
}
}