Günümüzde gittikçe popülerleşen ElasticSearch için basit bir JAVA program kodu bulamadım, bu işi yapacak basit bir Java programı yazmaya çalıştım.

ElasticSearch son zamanlarda popüler hale gelen bir arama motoru ve veri analiz aracıdır. Hem Elastic genel özellikleri hemde kurulumu konusunda şuradaki çok ayrıntılı yazıyı okuyabilirsiniz. Elastic Solr yada eşdeğerlerine karşın tüm işlemleri Rest(http) üzerinden halledebilmenize izin veren bir yapıya sahip. Yani sanki URL gönderir/açar gibi bir bilgi gönderdiğinizde ona göre işlem yapmakta. Elastic’in kabul ettiği syntax ise JSON. Yani Arama Ekleme gibi işlemlerde komutları JSON ile göndermelisiniz.

Elastic’in birçok dilde official API si bulunmakta. Bu api’yi kullanarak çok gelişmiş uygulamalar yapılabilmekte. Buna karşın bu api’lerin kurulumu ve gereklilikleri(dependency) bir o kadar fazla. Örneğin official JAVA Api’ye göre maven kurmanız gerekmekte ama yaptığınız her proje Maven desteklemeyebilir. Bunun yanında API kullanırken kontrolün bende olmadığına dair bir his de ortaya çıkmıyor değil.

Karmaşık API’lerden se tek class’dan oluşan sadece birşey yapabilmek istedim. Hangi yoldan gitmem gerektiğini bilmediğim için bunun için epey bir sürede uğraştım sonuç olarak Ekleme / Silme / Arama işlemleri yapabilen bir kod ortaya çıktı.

 ElasticSearch örnekleri yapmak için direk kod düzeninden başlamaktansa bir arayüz komut göndermek hem JSON’u anlamak hemde komutların sonuçlarını görmek açısından daha iyi olacaktır. Bu noktada şu adresteki bol resimli yazı gerçekten çok yararlıdır. Bende kendi örneklerimi oradaki yazıya göre aldım.

Kurulum ve JSON aşamalrını geçtikten sonra, Resmi örnekte ve yapılan her örnekte CURL ile bu verilerin gönderildiğini görüyoruz. Java’ya uygun CURL kütüphaneleri olsada yine daha karmaşıklaşıyor. CURL ile aynı işi yapan ve nispeten sade HttpURLConnection class’ını kullanmak daha mantıklı görünmektedir.

Aşamalarımız

1) Elastic’i kurmak
2) JSON’da göndereceğimiz veriyi hazırlamak
3) Veriyi Elastic’e göndermek

1) Elastıc dosyasını C://elastic klasorune atın. cmd den giriş elasticsearch.bat ı çalıştırın. ElasticSearch Çalıştı Tes için: http://localhost:9200/ kullanabilirsiniz. {JAVA SET HOME Sorunu çözümü (link)}

2) Üç Tane JSON nesnesi oluşturuyorum. Çünkü bu nesneler birbirinin ardına ekleniyor. JSON içten dışa doğru oluşturulmaya başlanan bir sistem. Elde etmeye çalıştığım örnek Query

curl -XPOST "http://localhost:9200/_search" -d'
{
    "query": {
        "query_string": {
            "query": "kill"
        }
    }
}'

Üsteki Yazıda curl , POST ve URL kısmını kodda hallediyoruz. Query içeriğine yazacağımız kısmıda alttaki kodda. Altatki kod’un çıktısı şu şekilde oluyor: “query”: {“query_string”: {“query”: “kill”}} 

JSONObject cred = new JSONObject();
JSONObject auth = new JSONObject();
JSONObject parent = new JSONObject();
cred.put(“query”, “Lawrence”);
auth.put(“query_string”, cred);
parent.put(“query”, auth);

Bu kodda yer alan parent bizim JSON’unumuz oluyor.

3)Oluşan JSON’umuzu elastic’e göndermek gerek burada da HttpURLConnection Class’ını kullanıyoruz. Bundan sonra satırların yanında açıklama vereceğiz. Aşağıdaki kod büyük orandan şu adresten alınmıştır.

String url = “http://localhost:9200/_search”; //URL’mizi yazdık
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”);          //Silme işlemi için delete olarak yazılacak

///////// JSON OLUŞTUR ///////////////

OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream());
wr.write(parent.toString());          //Yazdığımız JSON’u connection’a ekliyoruz. UTF ayarıda buradan yapın.
wr.flush();
// GÖNDERDiğiniz sorgu/işlemin sonucu almak içinde alttaki kodu uyguluyoruz
StringBuilder sb = new StringBuilder();
int HttpResult = con.getResponseCode();
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();
System.out.println(“” + sb.toString());
} else {
System.out.println(con.getResponseMessage());
}

Artık Query’imizi atmış olduk. Filtrelemelerden bazı özel aramalara kadar çok çeşitli search işlemlerini hem elasticsearch’in kendi sitesinde hem internette başka kaynaklarda bulabilirsiniz.

Genel olarak bakıldığında sistem bu şekilde işliyor Eklem ve silme işlemini joelabrahamsson.com ‘daki referansları alarak küçük değişiklikler ile yapabilirsiniz . Ben hali hazırda kendi projem için yaptım. Yaptığım kodda biraz daha modülerlik ekleme adına parçalar ayırdım ama halen anlaşılabilir. Projeteki tek class’ın metin dosyası olarak kaydını buradan(ElasticJavaSimpleexample) indirebilirsiniz. Eğer Netbeans projesi olarak isterseniz yorum yapıp yada mail atıp isteyebilirsiniz. 

Not: ELasticSearch UTF8 kullanıyor ve eğer İngilizce Dilli bir bilgisayardan TR karakter içeren bir JSON göndermeye kalkarsanız badrequest alacaksınız. Server işletim sistemi dili ile kullandığınız dilin aynı olmasına dikkat edin (Windows için)

 

Daha ayrıntılı bilgi için http://elasticsearchturkiye.com

Reklamlar