Podążam za Elasticsearch tutorial, ale wystąpił problem podczas próby użycia parametrów w skrypcie.Skrypt Elasticsearch - zmienna nie zdefiniowana
Krok 1: Utwórz nowy dokument - OK (index = website; type = blog; id = 1
)
curl -XPUT localhost:9200/website/blog/1?pretty -d '{
"title":"my first post",
"tags" : [ "tag1" ]
}'
Krok 2: Użycie skryptu, aby dołączyć dodatkową wartość do tags
tablicy - BŁĄD
curl -XPOST localhost:9200/website/blog/1/_update?pretty -d '{
"script" : "ctx._source.tags+=new_tag",
"params" : {
"new_tag" : "tag2"
}
}'
jest to komunikat o błędzie, wspominając o "reason" : "Variable [new_tag] is not defined."
Ale zdefiniowałem zmienną new_tag
zgodnie z opisem na stronie samouczka. Co ja robię źle?
"error" : {
"root_cause" : [
{
"type" : "remote_transport_exception",
"reason" : "[mrukUvA][127.0.0.1:9300][indices:data/write/update[s]]"
}
],
"type" : "illegal_argument_exception",
"reason" : "failed to execute script",
"caused_by" : {
"type" : "script_exception",
"reason" : "compile error",
"caused_by" : {
"type" : "illegal_argument_exception",
"reason" : "Variable [new_tag] is not defined."
},
"script_stack" : [
"ctx._source.tags+=new_tag",
" ^---- HERE"
],
"script" : "ctx._source.tags+=new_tag",
"lang" : "painless"
}
},
"status" : 400
}
Krok 2 (ponowienie) Kwalifikacja new_tag
z params
- BŁĄD
curl -XPOST localhost:9200/website/blog/1/_update?pretty -d '{
"script" : {
"inline": "ctx._source.tags+=params.new_tag",
"params" : {
"new_tag" : "tag2"
}
}
}'
daje błąd
{
"error" : {
"root_cause" : [
{
"type" : "remote_transport_exception",
"reason" : "[mrukUvA][127.0.0.1:9300][indices:data/write/update[s]]"
}
],
"type" : "illegal_argument_exception",
"reason" : "failed to execute script",
"caused_by" : {
"type" : "script_exception",
"reason" : "runtime error",
"caused_by" : {
"type" : "class_cast_exception",
"reason" : "Cannot cast java.lang.String to java.util.ArrayList"
},
"script_stack" : [
"ctx._source.tags+=params.new_tag",
" ^---- HERE"
],
"script" : "ctx._source.tags+=params.new_tag",
"lang" : "painless"
}
},
"status" : 400
}
jako kontrola poprawności, aby upewnić się, że dokument jest ważny
$ curl -XGET localhost:9200/website/blog/1?pretty
{
"_index" : "website",
"_type" : "blog",
"_id" : "1",
"_version" : 27,
"found" : true,
"_source" : {
"title" : "my first post",
"tags" : [
"tag1"
]
}
}
Tak więc dokument ma ważne pole tag
, które jest tablicą.
Może zajść potrzeba uzyskania dostępu do zmiennej za pomocą params.new_tag. Musisz powiedzieć, że pochodzi z params. – christinabo
Dzięki @christinabo próbowałem, ale czyniąc to daje inny błąd 'spowodowane_przez: typ: wyjątek_skryptu", powód: "błąd runtime", "null_pointer_exception" 'Wygląda na to, że wynika to z próby dereferencji' params'. samouczek sugeruje, że 'params' ma specjalne znaczenie tutaj: – sam
Którą wersję ES używasz? – Val