2017-03-28 33 views
5

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ą.

+0

Może zajść potrzeba uzyskania dostępu do zmiennej za pomocą params.new_tag. Musisz powiedzieć, że pochodzi z params. – christinabo

+0

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

+0

Którą wersję ES używasz? – Val

Odpowiedz

10

Twoja składnia jest nieznacznie wyłączona, jeśli masz parametry wymagane do skryptu, musisz mieć inline. Spróbuj:

curl -XPOST localhost:9200/website/blog/1/_update?pretty -d '{ 
    "script" : { 
     "inline": "ctx._source.tags.add(params.new_tag)", 
     "params" : { 
      "new_tag" : "tag2" 
     } 
    } 
}' 
+0

Witam @ Val, wydaje się, że wciąż dostaje ten sam błąd :-(Zaktualizowałem moje pytanie, aby dołączyć ta próba – sam

+0

Moja zła, musisz przedrostkiem 'new_tag' z' params' – Val

+0

Ciekawe, tym razem dostaję '" Nie mogę przesłać java.lang.String do java.util.ArrayList "', myślę, że teraz skrypt Składnia musi być jakoś poprawiona! – sam