Почему компилятор Painless жалуется на ключевое слово `new`?

Я пытаюсь создать строку из байтов в скрипте Painless, как показано ниже, но в итоге получаю ошибку вокруг ключевого слова new. Наш Elasticsearch — 6.2.8.

(Проверка длины в конце предназначена только для краткости, поэтому скрипт возвращает логическое значение.)

{
    "size": 1,
    "query": {
        "bool" : {
            "filter" : {
                "script" : {
                    "script" : {
                        "source": "byte[] a = new byte[]{65, 66, 67}; String b = new String(a, StandardCharsets.UTF_8); b.length() > 0",
                        "lang": "painless"
                     }
                }
            }
        }
    }
}

Ошибка, как показано ниже:

"script_stack": [
    "... {65, 66, 67}; String b = new String(a, StandardCha ...",
    "                             ^---- HERE"
],
"lang": "painless",
"type": "illegal_argument_exception",
"reason": "Unknown new call on type [java.lang.String]."

Должен признаться, я в замешательстве. Это мое первое приключение с Painless, но я видел десятки примеров с ключевым словом new. В документации четко указано, что это так. Да, это даже в том же сценарии выше. Что мне не хватает? Почему можно создавать массив, а не строку?


person wst    schedule 04.03.2020    source источник


Ответы (1)


Опубликуйте обсуждение в чате, и после дальнейших раскопок я понял, что String не предоставляет конструкторы через безболезненно, как указано в этом ссылка.

Эта ссылка поможет вы понимаете, что все классы или пакеты в настоящее время поддерживаются ES безболезненно.

Ошибка появляется, потому что StandardCharsets.UTF_8 принадлежит пакету import java.nio.charset.StandardCharsets;, и из приведенной выше ссылки видно, что этот класс в настоящее время не поддерживается или не упоминается в соответствии с более ранней общей ссылкой.

Также я не думаю, что безболезненно позволяет вам использовать операторы import. Однако то, что вы можете попробовать, указано в этой ссылке. в котором говорится следующее:

Начиная с версии 6.2, белый список Painless теперь может быть расширен за счет плагинов. К сожалению, это еще недостаточно документировано, но у нас есть пример плагин.

Основная идея состоит в том, чтобы создать плагин, который безболезненно «расширяет» и безболезненно сообщает о дополнительных элементах белого списка через SPI. Белый список составляется для контекста скрипта, поэтому вам нужно будет добавить эти элементы для любых типов скриптов, которые вы используете. Центрального списка контекстов скрипта нет, но похоже в этом случае вы используете скрипт обновления? Так что это будет контекст обновления. Затем в вашем скрипте вы можете использовать классы без необходимости импорта.

Если вы планируете написать свой собственный плагин, вы можете заглянуть в раздел для авторов подключаемых модулей в разделе Введение в плагины.

person Opster ES Ninja - Kamal    schedule 04.03.2020
comment
Пожалуйста, обновите ответ, если вы найдете решение или создадите собственный плагин. Тем временем я тоже попробую, в основном по ссылкам и посмотрю, смогу ли я что-нибудь получить - person Opster ES Ninja - Kamal; 05.03.2020
comment
Я не спорю с тем, что вы говорите. Это определенно полезно. Но в этом случае похоже, что что-то не так со String, а не с другим классом. Попытка сделать то же самое без второго аргумента приводит к той же ошибке. - person wst; 05.03.2020
comment
Глядя на эту ссылку, похоже, что они не разрешили ни одному из конструкторов String выставляться безболезненно. elastic.co/guide/en/elasticsearch/painless/current/ Я копаю глубже, чтобы понять причину, и дам вам знать, если что-нибудь найду - person Opster ES Ninja - Kamal; 05.03.2020
comment
Да, я полагаю, это именно это. Ваша ссылка была действительно полезной. Я пробовал с BytesRef, и все то же самое. Конструкторы не выставлены. Поскольку мы знаем причину, если вы готовы изменить ответ, я с радостью приму его. - person wst; 05.03.2020
comment
@wst Конечно, изменил ответ и добавил эту информацию. Не стесняйтесь принять ответ! - person Opster ES Ninja - Kamal; 05.03.2020