İçeriğe geç →

ElasticSearch Serisi 02 – C# ile Document Indexing ve Bulk Indexing

 

Yeni bir ElasticSearch serisi ile merhaba arkadaşlar.

Bu serimizde sizlerle, Document Indexing ve Bulk Indexing gibi işlemleri gerçekleştireceğiz. Bir önceki serimiz olan “ElasticSearch Serisi 01 – C# ile Index Oluşturmak” adlı makalede, type bazlı nasıl index oluşturulduğunu inceledik ve bir ElasticSearch projesi oluşturmuştuk. Bu serimizde de aynı proje üzerinden ilerliyor olacağız.

1) Document Indexing

elasticsearch-document-index

ElasticSearch’e Başlarken (Kurulum, Kibana, Marvel ve Sense) makalesinde de bahsettiğimiz gibi ElasticSearch üzerindeki Document’lar, RDBMS üzerindeki Row’lara denk gelmektedir. Biz ise burada daha önce type’ına göre oluşturmuş olduğumuz index’e, document’ları ekleyeceğiz yani indexleyeceğiz. Indexleme işleminde herhangi bir tokenizer veya analyzer kullanmayacağız. Bu konfigürasyon bilgilerine, gelecek ElasticSearch serilerinde detaylı olarak değineceğiz.

Hatırlarsak index oluşturma gibi işlemleri yürütecek olduğumuz “IElasticContext” interface’ini implemente eden bir “ElasticContext” imiz vardı. Aşağıdaki solution structure’ı üzerinden de hatırlayabiliriz.

elasticsearch-framework-solution-structure Index’leme işlemini de “ElasticContext” üzerinden gerçekleştireceğiz. Bunun için öncelikle “IElasticContext” interface’ini açalım ve aşağıdaki gibi yeni bir method imzası tanımlayalım.

Dikkat edersek “Index” isminde generic olarak yeni bir method tanımladık. Parametrelerinde ise “indexName” ve “T” tipinde bir document almaktadır. Projemizi geliştirirken abstraction’lardan ve generic type’lardan yararlanarak open-closed prensibine göre geliştirdiğimiz için, istediğimiz ölçüde class’larımızı extend edebilmekteyiz.

Interface’e method imzasını eklediğimize göre şimdi “ElasticContext” class’ı içerisinde yeni method’u implemente edebiliriz.

Index method’u “_elasticClient” üzerindeki “Index” method’unu kullanarak indexing işlemlerini gerçekleştirmektedir. Bu işlemler sırasında parametre olarak “document” ve bir adet function almaktadır. Bu function’ı fluent bir şekilde kullanarak, ilgili document’i hangi index’e atılacağı ve type’ının ne olduğunu söylüyoruz “_elasticClient” a. Bir önceki seriden hatırlarsak “Product” entity’si “Id” property’sine sahipti. NEST kütüphanesi document üzerindeki bu “Id” parametresini otomatik bir şekilde map’leyerek, elastic içerisine indexlemektedir. Eğer “Id” property’si farklı bir isimde olsaydı, ilgili function üzerinden yine fluent bir şekilde “Id()” method’unu çağırarak hangi property’nin “Id” olarak kullanılacağını söyleyebilirdik.

Not: Indexing sırasında spesifik olarak herhangi bir “id” property’si belirtmez isek, ElasticSearch bizim için kendisi 20 karakter uzunluğunda bir Base64-encoded GUID string tipinde bir “id” atamaktadır. Detaylara buradan erişebilirsiniz.

“Index” method’unu “ElasticContext” class’ına ekledikten sonra, class’ın son hali aşağıdaki şekilde olacaktır.

Index method’u şuan hazır durumda. Dilerseniz “ElasticSearch.DataTransfer” namespace’i altında bulunan, console uygulamasından hemen test edebiliriz. Bir önceki seride hatırlarsak, console üzerine index oluşturma ile ilgili test kodlarını yazmıştık. Main method’u üzerindeki index oluşturma ile ilgili method’ları sub method’lara bölelim ve yeni işlemimiz olan document indexleme kodlarını yazalım.

Bu işlemler sonucunda ise “Program.cs” class’ı aşağıdaki gibi olacaktır.

Burada dikkat edersek “CreateIndex” method’unu sub method olarak ayırdık ve içerisinde ihtiyaç duyabileceği değişkenleri tanımladık. Global olarak kullanacak olduğumuz değişkenler ise, Main method’u içerisinde kaldı. Bir diğer method’umuz olan “Index” method’unda ise, elasticContext üzerine yeni implemente ettiğimiz “Index” method’unu çağırıyoruz ve parametre olarak “indexName” ve yeni bir Product nesnesi veriyoruz. Bu işlem sonucunda ilgili Product nesnesi elastic üzerine NEST vasıtasıyla indexlenecek ve sonucu console üzerine yazılacaktır.

Dilerseniz console uygulamasını başlatalım ve sonucuna bir bakalım.

elastic-valid-response

Indexleme işlemimizin başarılı bir şekilde gerçekleştiğini “Valid NEST response built from a successful low call” cümlesinden anlayabiliyoruz. Product nesnesini Sense üzerinden kontrol ettiğimizde ise:

elastic-index-sense

“1” numaralı Id ile indexlendiğini görebilmekteyiz. Indexleme işlemi şimdilik bu kadardır.

“ElasticContext” artık hem verilen tipe göre yeni bir index oluşturabilme yetisine, hemde ilgili document’ı istenilen index üzerine indexleyebilme yetisine sahip olmuştur.

Not: Sense üzerinden “GET product_search/product/_search” komutu ile product’ları listeletebildiğimiz gibi “GET product_search/product/{id}” komutu ile de, istenilen “id” li ürün girildiğinde o ürüne ait detaylar çekilebilmektedir.

1) Bulk Document Indexing

Tıpkı Document Indexing özelliğini eklediğimiz gibi şimdide, Bulk Indexing yapabilmesi için ilgili method imzasını tanımlayıp implemente etmeye başlayacağız.

“IElasticContext” interface’ini aşağıdaki gibi genişletelim.

Eklemiş olduğumuz “BulkIndex” generic method imzası ile ilgili bulking işlemlerini gerçekleştiriyor olacağız. Bu sefer artık T tipinde bir document yerine, List of T almaktadır. “ElasticContext” class’ına gelelim ve yeni eklemiş olduğumuz method imzasını, aşağıdaki gibi implemente etmeye başlayalım.

Implemente etmiş olduğumuz “BulkIndex” method’u içerisinde “_elasticClient” üzerindeki “IndexMany” method’unu call etmektedir. Bu method ise bulk işlemler için yazılmış shortcut bir method’dur.

Context’i hazırladıktan sonra şimdi “Program.cs” i aşağıdaki gibi güncelleyelim ve debug işlemini başlatalım.

“Main” method’u içerisinde diğer method’ları kapattık ve sadece yeni eklemiş olduğumuz “BulkIndex” method’unu çağırıyoruz. Burada 3 farklı ürün’ü, list of Product tipinde “elasticContext” üzerine eklemiş olduğumuz “BulkIndex”method’una gönderiyoruz.

Console uygulamasını çalıştırdıktan sonra Sense üzerinden bir search query’si atalım ve işlem sonucuna bir bakalım.

elasticsearch-bulk-index

Response kısmındaki seçili alana baktığımızda eklediğimiz 3 adet product’ın başarılı bir şekilde indexlendiğini görebilmekteyiz. Burada bir noktaya dikkatinizi çekmek istiyorum. Makalenin giriş kısımlarında zaten “1” numaralı Id’ye sahip olan “Iphone 6s Plus” product’ını “4000” price’a sahip olacak şekilde eklemiştik. Fakat bulk işlemimiz sırasında ise, aynı ürünü aynı Id ile sadece price bilgisini “5000” olarak gönderdik. ElasticSearch burada otomatik olarak ilgili Type ve Id‘ye sahip doküman için, Update işlemi gerçekleştirdi.

ElasticSearch burada bizi bir yükten daha kurtarıyor. Eğer ilgili doküman zaten mevcut ise aynı Type ve Id ile, update işlemini kendisi gerçekleştiriyor. Bu sayede update işlemi için herhangi bir efor harcamamız gerekmiyor.

Bir elastic serisinin daha sonuna geldik. Geliştiriyor olduğumuz bu yapının, faydalı olmasını temenni ederim.

Projenin güncel haline, ekten ulaşabilirsiniz.

Takipte kalın.

ElasticSearch-Index-BulkIndex

Bu makale toplam (1575) kez okunmuştur.

9
0



Kategori: Search Engine

2 Yorum

  1. Hakan Hakan

    Hocam ellerinize sağlık

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.