Я новичок в Elastic Search и изучал запрос агрегации.У меня есть документы в формате -
{"name":"A",
"class":"10th",
"subjects":{
"S1":92,
"S2":92,
"S3":92,
}
}
У нас в ES есть около 40 тыс. Таких документов с разными предметами от ученика к ученику.Запрос к системе может заключаться в агрегировании всех предметных оценок для данного класса.Мы попытались создать запрос агрегации сегментов, как описано в этом руководстве здесь , однако при этом создается один фрагмент на документ, и в нашем понимании требуется явное упоминание каждого предмета.
Мы хотим, чтобы система генерировала тематические агрегированные данные для данных, выполняя один запрос агрегации. Проблема, с которой я сталкиваюсь, заключается в том, что в наших данных предмет может варьироваться от студента к студенту, и у нас нет глобальногосписок предметных ключей.
Мы написали следующий сценарий, но он работает, только если мы знаем все возможные предметы.
GET student_data_v1_1 / _search
{ "query" :
{"match" :
{ "class" : "' + query + '" }},
"aggs" : { "my_buckets" : { "terms" :
{ "field" : "subjects", "size":10000 },
"aggregations": {"the_avg":
{"avg": { "field": "subjects.value" }}} }},
"size" : 0 }'
, но этот запрос работает только для структуры документа, но не работает, если определены несколько предметов, где мы можем не знать пару ключей -
{"name":"A",
"class":"10th",
"subjects":{
"value":93
}
}
Альтернативная форма представления документа заключается в том, что предметом является список словарей -
{"name":"A",
"class":"10th",
"subjects":[
{"S1":92},
{"S2":92},
{"S3":92},
]
}
Было бы полезно иметь запрос агрегации для решения любого из двух форматов документа.
====== РЕДАКТИРОВАТЬ ======
После обновления документа для хранения весов для каждого предмета -
{
class": "10th",
"subject": [
{
"name": "s1",
"marks": 90,
"weight":30
},
{
"name": "s2",
"marks": 80,
"weight":70
}
]}
Я обновил запрос, чтобы-
{
"query": {
"match": {
"class": "10th"
}
},
"aggs": {
"subjects": {
"nested": {
"path": "scores"
},
"aggs": {
"subjects": {
"terms": {
"field": "subject.name"
},
"aggs" : { "weighted_grade": { "weighted_avg": { "value": { "field": "subjects.score" }, "weight": { "field": "subjects.weight" } } } }
}
}
}
}
},
"size": 0
}
но выдает ошибку-
{u'error': {u'col': 312,
u'line': 1,
u'reason': u'Unknown BaseAggregationBuilder [weighted_avg]',
u'root_cause': [{u'col': 312,
u'line': 1,
u'reason': u'Unknown BaseAggregationBuilder [weighted_avg]',
u'type': u'unknown_named_object_exception'}],
u'type': u'unknown_named_object_exception'},
u'status': 400}