Java ile Apache Solr’a Veri İndeksleme

Merhabalar, bir önceki yazımda Apache Solr kurulumundan, konfigürasyonundan, komut satırından Solr’a veri indeksleme ve bu veriler üzerinden sorgu yapabilme işlemlerinden bahsetmiştim. Bu yazının daha iyi anlaşılabilmesi için Sol Sunucunun kurulum aşamalarını ve konfigürasyonu anlatan bu yazının okunması faydalı olacaktır.

Solr sunucusunu kurduktan sonra herhangi bir programlama dili kullanarak, Solr’a yeni veriler indekslenebilir ve bu veriler üzerinde sorgulamalar yapılabilir. Bu yazıda Java programalama dili kullanarak Solr’a veri gönderip indekslemeyi anlatacağım.

Programatik bir şekilde Solr sunucu ile haberleşebilmek için bir “Solr Client Library” kullanmamız gerekiyor. Yazılım yaptığınız programlama diline göre kullanabileceğiniz bu kütüphanelere bu linkten bakabilirsiniz.

Eğer Java kullanarak bu Solr sunucu ile haberleşip işlem yapmak istiyorsak, Client Library olarak SolrJ kütüphanesini kullanmamız gerekiyor.

SolrJ kütüphanesinin bağımlı olduğu (kullandığı) diğer kütüphaneler:

  • apache-solr-solrj-*.jar (Kullanacağımız SolrJ Kütüphanesi)
  • commons-codec-1.3.jar
  • commons-httpclient-3.1.jar
  • commons-io-1.4.jar
  • jcl-over-slf4j-1.5.5.jar
  • slf4j-api-1.5.5.jar

Geliştirme ortamında bir proje açıp bu kütüphaneleri projeye dahil ettikten sonra kod geliştirmeye başlayabiliriz.

Kod geliştirmeye başlamadan önce Solr sunucunuzu başlattığınızdan emin olunuz. Herhangi bir browser’dan http://localhost:8983/solr/ adresini girip kontrol edebilirsiniz. Eğer solr sunucunuz çalışır durumda ise, Solr yönetici panelinin açılması gerekiyor.

Bir proje açıp gerekli kütüphaneleri ekleyip ve sorl sunucunuzu ayağa kaldırdıktan sonra aşağıda yazılan kod örneği ile Solr sunucuya veri gönderip indeksletebilirsiniz.

import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.common.SolrInputDocument;
import java.io.IOException;

public class SolrApp {

    public static void main(String[] args) throws IOException, SolrServerException {

        String solrServerUrl = "http://localhost:8983/solr";
        CommonsHttpSolrServer server = new CommonsHttpSolrServer(solrServerUrl);

        SolrInputDocument solrDoc = new SolrInputDocument();
        solrDoc.addField("id", "verilen_id");
        solrDoc.addField("name", "Urun Adi");
        solrDoc.addField("manu", "Bank of America");
        solrDoc.addField("cat", "Category");
        solrDoc.addField("features", "Features");
        solrDoc.addField("price", "123 TL");
        solrDoc.addField("inStock", true);
		
        server.add(solrDoc);
        server.commit();
    }
}

  • Solr Server Yaratma:

Solr sunucuya veri gönderebilmek için new  CommonsHttpSolrServer(solrServerUrl); diyerek bir Solr Server oluşturulur. Burada örnek amaçlı gösterildiğinden direk new ile yarattım. Büyük bir projede kullanılırsa Singleton bir Solr Server yaratmak daha mantıklı olacaktır.

  • Solr Document Yaratma

Daha önceki yazıda bahsettiğim gibi, Solr açısından veriler Document olarak ifade edilmektedir. Bu Document’i tanımladığımız yer ise schema.xml dosyası olmaktadır. Schema.xml ile bir Document’in bütün özelliklerini tanımlıyoruz, tanımladığımız bu özelliklere göre new SolrInputDocument();  ile yeni bir document yaratıp ilgili değerleri atadıktan sonra sunucuya indeksletmek üzere gönderebiliriz.

  • Verileri indeksleme

Yukarıdaki örnekte SolrInputDocument() yarattıktan sonra server.add(…) komutu ile bu oluşturulan Document Solr sunucuya gönderilir. Bu aşamada bu yeni değer henüz indekslenmediği için sorgulama sonuçlarında görüntülenmez. Solr’a eklenen bu yeni değerlerin indekslenmesi için server.commit() komutunu çalıştırmamız gerekiyor.

Sorl sunucuya yeni bir Document eklendikten sonra hemen commit yapmaya gerek yoktur. Uygulamanızın mantığına göre örneğin Solr sunucuya yüz tane yeni document eklendikten sonra bir commit yaparak tüm bu değerler indekslenebilir. Her eklenen yeni Document için bir commit yapmak yeterince masraflı bir iş olacaktır.

  • Document Listesi Eklemek

Örnek amaçlı verilen yukarıdaki kod örneğinde SolrDocument() birer birer eklenebileceği gibi bir liste halinde de Sorl Sunucuya gönderilebilir. Kod örneği:

 

	Collection docs = new  ArrayList();
	docs.add( doc1 );
	docs.add( doc2 );
	server.add( docs );
	server.commit();
	

 

  • Java Bean yaratarak Solr’a Veri Göndermek

Solr sunucuya veri göndermek için bir Document yada  Document listesi ekleyebileceğimiz gibi, bir POJO ya da POJO listesi oluşturup gönderebiliriz. Bunun için yarattığımız nesnenin elemanlarında @Field (org.apache.solr.client.solrj.beans.Field) notasyonunu kullanabiliriz.

Yeni bir sınıfı oluşturma:

public class MySolrDocument {

   @Field
   String id;

   @Field
   String name;
   
   // kod uzun olmasin diye tüm elemanlari yazmadim - ayrica getter ve setter yazilmalidir
}

 

Yeni bir nesne yaratma ve Solr sunucuya ekleme:

	MySolrDocument doc = new MySolrDocument();
	doc.id = "documentid";
	doc.name = "documentName";

	server.addBean(doc);
	// ya da server.addBeans(BeanListesi) ile bir liste halinde veriler eklenebilir

  • Solr Sunucudaki tüm Verileri Silmek

Solr sunucuya ekledğiniz tüm verileri silmek için aşağıdaki kodu çalıştırabilirsiniz

	server.deleteByQuery( "*:*" );

Faydalı olması temennisiyle.

No Comments

Post a Comment

Comment
Name
Email
Website