Merhaba ElasticSearch de döküman güncelleme indexlediğimiz dökümanları bazen yeni alanlar ekleyerek bazende mevcut verilerini değiştirerek güncellemek gerekebiliyor
Elasticsearch’de diğer tüm sistemler gibi dökümanları güncellemeye izin vermektedir, buna karşın elasticsearch document based bir sistem olduğundan SQL’deki gibi WHERE ile Update yapıldığı gibi birden fazla sayıda belli kritere uyulan dosyaları update seçeneği gibi bir seçenek mevcut değildir. Bunun yerine elasticsearch’de güncellemek istediğiniz dokumanID’lerini tek tek verip her güncelleme komutunu her dokuman için uygulamanız gerekmektedir.
Elasticsearch’de 2 türlü belge güncelleme özelliği mevcut,
- Eski dokumanı kaldırıp aynı ID’li yeni döküman kaydetmek, (kaynak)
- Dökümanı güncellemek sureti ile varsa mevcut alanı güncellemk, yoksa yeni alan eklemek (kaynak)
1) Eski belgeyi silerek güncellemek
1 2 3 4 5 6 |
PUT /website/blog/123 { "title": "My first blog entry", "text": "I am starting to get the hang of this...", "date": "2014/01/02" } |
Bu örnekte eski döküman silinir ve son query’deki bilgiler kaydedilir.
2) Dökümanı Güncellemek
Benimde kullandığım ve sıkça kullanılan yöntem bu yöntemdir. Eğer sizin gönderdiğiniz query’de bulunan alanlar yoksa o alanları yaratıp dolduruyor, aynı alanlar varsa da update etmekte, diğer tüm alanlar aynen kalmaktadır.
1 2 3 4 5 6 7 |
POST /website/blog/1/_update { "doc" : { "tags" : [ "testing" ], "views": 0 } } |
Buradaki 1 elasticID olacaktır. doc ise source içindeki alanları değiştirmek içindir, ister array ister string ister int güncellem yapabilirsiniz. Alttaki örnekte name isimli alan elasticID nolu dokumanda güncellemektedir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public void update(String elasticID, String name ){ try { JSONObject cred = new JSONObject(); JSONObject auth = new JSONObject(); JSONObject parent = new JSONObject(); cred.put("name ", name ); parent.put("doc", cred); String url = "http://192.168.0.1:9200/isimler/" + elasticID.trim() + "/_update?pretty"; URL object = new URL(url); HttpURLConnection con = (HttpURLConnection) object.openConnection(); con.setDoOutput(true); con.setDoInput(true); con.setRequestProperty("Content-Type", "application/json"); con.setRequestProperty("Accept", "application/json"); con.setRequestMethod("POST"); OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream(), "UTF-8"); wr.write(parent.toString()); wr.flush(); StringBuilder sb = new StringBuilder(); int HttpResult = con.getResponseCode(); HttpResult = HttpResult - 1; if (HttpResult == HttpURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8")); String line = null; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } br.close(); } else { } } catch (Exception e) { } } |
Not: Gizlilik gereği kod’da buraya kopyaladıktan sonra değişiklik yapmak durumunda kaldım küçük syntex hataları olabilir.