есть ли какой-нибудь способ, которым я могу получить ключ ведра из scripted_metric?У меня есть проблема, из-за которой мне нужно получить определенные данные из объединяемого документа.
Например, это пример документа, над которым я работаю:
{
"attr1": "thing",
"groups": [
{
"id": 1,
"name": "foo"
},
{
"id": 2,
"name": "bar"
},
{
"id": 3,
"name": "baz"
}
],
"otherAttrs": true
}
Рисунок 1 (структура документа)
Я делаю агрегирование терминов по отдельным идентификаторам групп, но в каждом сегменте я хотел бы указать название представляемой группыс помощью bucket_key (который будет идентификатором).
Это пример агрегации терминов, которую я использую:
{
"terms": {
"execution_hint": "global_ordinals_hash",
"field": "actors.groups.id",
"min_doc_count": 1
}
}
Рисунок 2 (термины агрегации всоздать сегменты, в которых я пытаюсь задать имя в качестве поля)
Поэтому в идеале мой ответ должен выглядеть примерно так:
{
"...": "...",
"buckets" : [
{
"key" : 1,
"group_name": "foo",
"doc_count" : 42684,
"measure 0" : {
"value" : 37180
},
"measure 3" : {
"doc_count" : 37180,
"measure 3" : { "value" : 68 }
},
"measure 4" : {
"doc_count" : 3008,
"measure 4" : {
"value" : 3008
}
}
}
]
}
Рисунок 3 (Идеальный формат ответа))
Обратите внимание, как ключ соотносится с именем, показанным на рисунке 1
Так что в настоящее время я получаю ответ, похожий на рисунок 3 (без имени группы), и я не могу на всю жизнь выяснитькак извлечь поле имени, потому чтоиспользуйте его в объединяемом документе.
В связи с характером документов, с которыми я работаю, это должно происходить в рамках агрегации сегментов, но этот один атрибут не является агрегацией, это всего лишь одна метрика, котораяМне нужно снять один документ.
Поэтому я попытался решить эту проблему с использованием scripted_metric:
{
"...":"...",
"group_name": {
"scripted_metric": {
"map_script": {
"lang": "painless",
"source": """
for (HashMap group : params._source.actor.groups) {
String groupId = < bucket_key_here >;
if (groupId != null && !groupId.isEmpty()) {
params._aggs.name = params._source.actor.groups[groupId].name;
}
}
"""
},
"reduce_script": {
"lang": "painless",
"source": "return params._aggs.length > 0 ? params._aggs[0].name : null;"
}
}
},
"...":"..."
}
Рисунок 4 (Текущая попытка использоватьscripted_metric для выявления имени группы)
Я не могу понять, как получить доступ к значению ключа сегмента, что означает, что даже если я использую _source для доступа к структуре JSON агрегируемого документа, я не могу увидеть блок вЧтобы определить, какая группа является правильным именем.
Обратите внимание, что на рисунке 1 один документ может содержать несколько групп.Поэтому мне нужно иметь возможность ссылаться на ключ, чтобы соответствовать имени из соответствующего идентификатора.
Пожалуйста, дайте мне знать, если я могу уточнить или объяснить что-нибудь, чтобы сделать эту проблему более ясной.
Привет