2017-04-18 10 views
4

私はESには新しいですが、私はそれを掛けています。 これは本当に強力なソフトウェアですが、ドキュメントは実際には不足していて混乱していると言わざるを得ない。ElasticSearch - 整数配列に追加

はここに私の質問です: 私はこのようになります整数配列、持っている:私は「update_by_query」コールを経由してその配列に整数を追加したい

"hits_history" : [0,0] 

を、私はこのリンクを検索し、見つかりました: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html この例があります

POST test/type1/1/_update 
{ 
    "script" : { 
     "inline": "ctx._source.tags.add(params.tag)", 
     "lang": "painless", 
     "params" : { 
      "tag" : "blue" 
     } 
    } 
} 

ので、私が試した:

curl -XPOST 'localhost:9200/example/example/_update_by_query?pretty' -H 'Content-Type: application/json' -d' 
    { 
     "script": { 
     "inline": "ctx._source.hits_history.add(params.hits)", 
     "params": {"hits": 0} 
     }, 
     "query": { 
     "match_all": {} 
     } 
    } 
    ' 

が、それは私にこのエラーました:だから

"ctx._source.hits_history.add(params.hits); ", 
"         ^---- HERE" 
"type" : "script_exception", 
    "reason" : "runtime error", 
    "caused_by" : { 
     "type" : "illegal_argument_exception", 
     "reason" : "Unable to find dynamic method [add] with [1] arguments for class [java.lang.Integer]." 

を、私はさらに見て、これを見つけた:https://www.elastic.co/guide/en/elasticsearch/guide/current/partial-updates.html

この例を持っている:

We can also use a script to add a new tag to the tags array.

POST /website/blog/1/_update 
{ 
    "script" : "ctx._source.tags+=new_tag", 
    "params" : { 
     "new_tag" : "search" 
    } 
} 

だから私はそれを試してみました:

curl -XPOST 'localhost:9200/example/example/_update_by_query?pretty' -H 'Content-Type: application/json' -d' 
{ 
    "script": { 
    "inline": "ctx._source.hits_history += 0;" 
    }, 
    "query": { 
    "match_all": {} 
    } 
} 
' 

結果:だから

"type" : "script_exception", 
    "reason" : "runtime error", 
    "caused_by" : { 
     "type" : "class_cast_exception", 
     "reason" : "Cannot apply [+] operation to types [java.util.ArrayList] and [java.lang.Integer]." 

、私はArrayListに項目を追加することができますか?私が調べなければならない最新の文書はありますか? ctx._source.hits_history.add(ctx._source.today_hits); ctx._source.today_hits = 0;

あなたは(一つの値を含む)配列として最初の値を格納する必要があり、あなたに

答えて

3

ありがとう:私はやりたいこと

は、単純にこのようなものでした。 次に、add()メソッドを使用できます。

POST /website/blog/1/_update 
{ 
    "script" : "if (ctx._source.containsKey('tags')) { ctx._source.tags.add('next') } else { ctx._source.tags = ['first'] }" 
} 
+0

ええ、私は追加するとき、それはエラーを与えていたので、残念ながら一つのアイテムではなく、リストのインデックスとインデックスにあった、それを持っていました。 – DarkW