Как агрегировать по полю 'ip', используя скрипт - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь выполнить агрегирование терминов по полю типа 'ip' с помощью встроенного сценария, например:

{
    "aggs": {
        "by_ipaddress": {
            "terms": {
                "script": {
                    "inline": "doc['ipAddressFrom'].value",
                    "lang": "painless"
                }
            }
        }
    }
}

Выдает следующее исключение:

"reason": {
                "type": "script_exception",
                "reason": "runtime error",
                "caused_by": {
                    "type": "array_index_out_of_bounds_exception",
                    "reason": "16"
                },
                "script_stack": [
                    "org.apache.lucene.util.UnicodeUtil.UTF8toUTF16(UnicodeUtil.java:602)",
                    "org.apache.lucene.util.BytesRef.utf8ToString(BytesRef.java:152)",
                    "org.elasticsearch.index.fielddata.ScriptDocValues$Strings.getValue(ScriptDocValues.java:83)",
                    "doc['ipAddressFrom'].value",
                    "                    ^---- HERE"
                ],
                "script": "doc['ipAddressFrom'].value",
                "lang": "painless"
            }

Но когда я агрегирую по одному и тому же полю:

{
    "aggs": {
        "by_ipaddress": {
            "terms": {
                "field": "ipAddressFrom"
            }
        }
    }
}

Работает.

Отображение для поля «ipAddressFrom»:

 "ipAddressFrom" : {
    "type" : "ip"
}

Пожалуйста, дайте мне знать, как использовать поля ip в скрипте.

1 Ответ

0 голосов
/ 17 сентября 2018

Вasticsearch 6.x нет ничего плохого в использовании типа ip в безболезненных сценариях.

Ваша агрегация с inline не работает, поскольку для некоторых документов поле ipAddressFrom не существует.

Вы можете исправить агрегацию что-то вроде:

 "script": {
      "inline": "if (doc.containsKey('ipAddressFrom') && !doc['ipAddressFrom'].empty){ return doc['ipAddressFrom'].value} else {return '0'}",
      "lang": "painless"
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...