2013-04-12 5 views
5

例を存在しない場合は、次のとおりです。文書が以前に存在しない場合に動作しますElasticsearch更新APIフィールドがアップサートのため

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ 
    "script" : "ctx._source.counter += count", 
    "params" : { 
     "count" : 4 
    }, 
    "upsert" : { 
     "counter" : 1 
    } 
}' 

必ずしも存在するとは限りませんが、ドキュメントが存在するフィールドを更新したいとします。 たとえば、文書にまだカウンターフィールドがない可能性があります。

どうすればいいですか?

答えて

9

あなたはフィールドが存在するかどうかを確認するために、更新スクリプトを使用することができます。

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ 
    "script" : "if(ctx._source.containsKey(\"counter\")){ ctx._source.counter += count; } else { ctx._source.counter = 1; }", 
    "params" : { 
     "count" : 4 
    }, 
    "upsert" : { 
     "counter" : 1 
    } 
}' 
+0

素晴らしい!実際にMVEL言語を説明するサイトがあるかどうか知りませんか?私はそれを学ぶために全力を尽くしましたが、まともなリソースを見つけることはできません。 http://mvel.codehaus.org/Language+Guide+for+2.0は恐ろしいもので、何もないところについています。 – eran

+1

これは私が知っている最高のリソースです。私の助言は、[javascript plugin](https://github.com/elasticsearch/elasticsearch-lang-javascript)をインストールして、スクリプト言語としてjavascriptに切り替えることです。 – imotov

+0

スクリプト言語に関するelasticsearchのドキュメントから: 'スクリプトモジュールはデフォルトでgroovy(1.3.x以前のバージョン)を使用しています' –

0

更新要求の最も単純な形式は、ちょうどが既存と合併しますdocパラメータ、 として部分文書を受け入れます資料。 オブジェクトがマージされ、既存のスカラーフィールドが上書きされ、 と新しいフィールドが追加されます。

(1)ただ一つのフィールドで、新しいドキュメントを作成field1

curl -XPOST localhost:9200/myidx/mytp/myid?pretty -d '{ 
    "field1" : 1 
}' 

あなたの文書があり、

"_source" : { 
    "field1" : 1 
} 

(例えばPartial Updates to Documents

、参照してください。 2)非部分的更新あなたの文書は、

"_source" : { 
    "field1" : 1, 
    "field2" : 2 
} 

あるfield2

curl -XPOST localhost:9200/myidx/mytp/myid/_update?pretty -d '{ 
    "doc" : { 
     "field2" : 2 
    } 
}' 

、フィールドを-existingすること(3)もちろん、あなたがsimutaneously

curl -XPOST localhost:9200/myidx/mytp/myid/_update?pretty -d '{ 
    "doc" : { 
     "field2" : 200, 
     "field3" : 3 
    } 
}' 

既存および非既存のフィールドを更新することができます文書は、

"_source" : { 
    "field1" : 1, 
    "field2" : 200, 
    "field3" : 3 
} 
関連する問題