Получить ключ корзины внутри scripted_metric - PullRequest
0 голосов
/ 19 февраля 2019

есть ли какой-нибудь способ, которым я могу получить ключ ведра из 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 один документ может содержать несколько групп.Поэтому мне нужно иметь возможность ссылаться на ключ, чтобы соответствовать имени из соответствующего идентификатора.

Пожалуйста, дайте мне знать, если я могу уточнить или объяснить что-нибудь, чтобы сделать эту проблему более ясной.

Привет

...