Как мы должны проверить, имеет ли значение ключ в карте, переданный в качестве параметра безболезненному сценарию, значение? В настоящее время я делаю это в Elasticsearch 6.8.4
if (params.feedId!=null) {
whatever()
}
, но выдает это исключение, когда
params.feedId
равно нулю
ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=Cannot cast null to a primitive type [void].]]
Он отлично работает с Elasticsearch 5.6.13, так что, похоже, произошли серьезные изменения, но я пока ничего не смог найти.
ОБНОВЛЕНИЕ: Это былона самом деле это не проблема с этой частью скрипта, но в некоторых его частях мы выполняли return null; , чтобы прервать процесс скрипта, который по какой-то причине больше не работает. Чтобы дать больше контекста, я делаю эти обновления, используя Java API, в частности клиент Rest High Level.
Мне удалось воспроизвести проблему с помощью команды curl, подобной этой
curl -X POST "localhost:9200/myindex/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d'
{
"script": {
"source": "ctx._source.result = true; return null;"
}
}'
Это приводит к следующему выводу:
{
"error" : {
"root_cause" : [
{
"type" : "remote_transport_exception",
"reason" : "[sBix--f][172.18.0.4:9300][indices:data/write/update[s]]"
}
],
"type" : "illegal_argument_exception",
"reason" : "failed to execute script",
"caused_by" : {
"type" : "script_exception",
"reason" : "compile error",
"script_stack" : [
"... ce.result = true; return null;",
" ^---- HERE"
],
"script" : "ctx._source.result = true; return null;",
"lang" : "painless",
"caused_by" : {
"type" : "illegal_argument_exception",
"reason" : "Cannot cast null to a primitive type [void]."
}
}
},
"status" : 400
}
Просто замена return null; for return; делает этот скрипт нормально работающим в ES 6.8.4.
Обнаружил эту проблему в Elasticsearch: https://github.com/elastic/elasticsearch/issues/35888. Есть некоторые несоответствия в том, как работает короткое замыкание в разных версиях Elasticsearch.