Почему безболезненный компилятор жалуется на ключевое слово `new`? - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь создать строку из байтов в сценарии 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. В документации ясно говорится, что это так. Дух, это даже в том же сценарии выше. Что мне не хватает? Почему можно создать массив, а не строку?

1 Ответ

2 голосов
/ 05 марта 2020

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

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

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

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

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

Основная идея c - создать плагин, который "расширяет" безболезненно и безболезненно говорит о дополнительных элементы белого списка через SPI. Белый список соответствует контексту скрипта, поэтому вам нужно будет добавить эти элементы для любых типов скриптов, которые вы используете. Не существует центрального списка контекстов скрипта, но похоже, что в этом случае вы используете скрипт обновления? Так что это будет контекст обновления. В вашем скрипте вы можете использовать классы, импорт не требуется.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...