2013-04-12 25 views
5

örnek yoksa geçerli: Belge önceden yoksa çalışırElasticsearch Güncelleme API alan Upsert için

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

.

Varolmayan bir alanı güncelleştirmek istiyorum ama belgenin var olduğunu varsayalım. Örneğin, belgenin henüz bir sayaç alanı olmayabilir.

Bunu yapmayı nasıl yaparım? alan varsa

cevap

9

Sen denetlemek için güncelleme komut dosyasını kullanabilirsiniz:

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

Harika! MVEL dilini gerçekten açıklayacak bir site olup olmadığını biliyor musunuz? Öğrenmek için elimden geleni yaptım, ama iyi bir kaynak bulamadım. http://mvel.codehaus.org/Language+Guide+for+2.0, korkunç ve hiçbir şeyin yanına kapanmıyor – eran

+1

Bu benim bildiğim en iyi kaynak. Benim önerim [javascript eklentisini] (https://github.com/elasticsearch/elasticsearch-lang-javascript) yüklemek ve betik diliniz olarak javascript'e geçmek olacaktır. – imotov

+0

Komut dosyası dili ile ilgili elasticsearch belgelerinden: 'Scripting modülü varsayılan olarak groovy (daha önce 1.3.x ve önceki sürümlerde) kullanır. –

0

güncelleme isteği en basit formu olarak sadece ile birleşti alır doc parametreyi, kısmi belge kabul varolan belgesi. Nesneler birlikte birleştirilir, varolan skaler alanların üzerine yazılır, ve yeni alanlar eklenir.

(1) sadece bir alanıyla, yeni bir belge oluşturun field1

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

Belgeniz olduğunu

"_source" : { 
    "field1" : 1 
} 

(Örneğin Partial Updates to Documents

Bakınız 2) Kısmi güncelleme olmayan -Varolan alan field2

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

Belgeniz olduğunu

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

(3) Tabii ki, mevcut güncelleyebilir ve var olmayan alanlar

simutaneously

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

"_source" : { 
    "field1" : 1, 
    "field2" : 200, 
    "field3" : 3 
} 
İlgili konular