İçeriğe geç →

Lucene.Net Search Engine Kütüphanesi Kullanımı

Merhaba arkadaşlar, uzun bir aradan sonra karşınızda güzel bir kütüphane incelemesi ile geliyorum.

Günümüzde yaygınlaşan teknoloji ile artık ciddi anlamda büyük boyutlu veriler ile çalışmaktayız. Zaman zaman bir e-ticaret projesindeki ürünlerin çokluğunu düşünün veya bir sosyal platform sitesi. Özünde geliştirmiş olduğumuz uygulamalarda hepimiz search işlemi yapma ihtiyacı duymaktayız. Eğer geliştirmiş olduğumuz uygulamada verimizin boyutu ciddi anlamda büyük değilse bunu bir şekilde filtreli sql sorguları ile halledebiliyoruz. Veri boyutumuz dahada büyümeye başladığında ise performans çalışmaları adı altında dahada filtrelenerek git gide kompleks sql sorgularına ve bir zaman sonra bir çıkmaza doğru gidiyoruz. 🙂

Şu sorguyu bir düşünün:

Eğer veri boyutumuz ciddi anlamda büyük ise (örneğin 20.000+ veya daha az yada çok) istediğimiz kadar Name alanına index versekte veya farklı WHERE kriterleride taksak, günümüz hız teknolojisinde response time olarak geri kalacağız. Özellikle küreselleşen rekabet ortamında herkes daha iyisini ve daha hızlısını yapmaya çalışıyorken.

İşte bu gibi durumlarda imdadımıza çok güzel bir search engine kütüphanesi olan Lucene gibi yapılar koşuyor.

Lucene Nedir?

En saf hali ile Apache Lucene projesi kapsamında olan full-text search engine diyebiliriz. Günümüz teknolojisinde gayet popülerliğini koruyan search engine’ler arasındaki Elastic Search ve Solr‘nin alt yapısını oluşturmaktadır. Lucene temelinde Java ile geliştirilmiştir ve .Net versiyonu ilede .Net kullanıcılarınında kullanımına sunulmuştur.

Çalışma Mantığı İse:

Indexlenecek olan veri gönderilir ve Lucene tarafından dosya sistemi üzerinde indexlenir. Arama işlemi yapacağımız zaman ise indexlemiş olduğu dosya sistemi üzerinde arama yapar ve istenildiği kadar alan üzerinde de indexlemeye olanak sağlamaktadır. RDBMS’lerdeki full-text search işlemlerinden daha performanslı bir sonuç göstermektedir. (Yapacak olduğumuz örnek uygulama üzerinde de inceliyor olacağız.)

Çok büyük veriler üzerinde full-text search işlemi yapacaksak isek, gerçekten harika bir kütüphanedir. Diğer yandan indexlemek istediğimiz içeriğin path’ini vererek, indexleme işlemini Lucene’e yaptırabiliyoruz.

Visual Studio’mu açıp hemen LuceneSearchEngine isminde yeni bir konsol uygulaması oluşturuyorum. Oluşturmuş olduğumuz konsol uygulamasına NuGet Package Manager üzerinden Lucene.Net‘i bulup projeye dahil ediyorum.

lucene1

Referansları dahil ettikten sonra örneğimizde kullanacağımız Product class’ını oluşturmuş olduğum Entities klasörü içerisinde oluşturuyorum. Şimdi sıra geldi search engine ile ilgili gerekli business’ı barındırıcak olan LuceneEngine class’ını oluşturmaya. İlk kısımda sizlere en basit haliyle ilgili entity’lerimizi, Lucene ile nasıl indexleyebiliriz’i göstermek istiyorum. Dilerseniz incelemeye başlayalım.

AddToIndex metot’u ile parametre olarak IEnumerable olarak Product entity’lerimizi alıyoruz. IndexWriter objesine ise parametrelerinde hangi path’e indexleyeceği bilgisini Directory objesi ile veriyoruz ve ardından constructor’da oluşturmuş olduğumuz analyzer tipini veriyoruz ve limitsiz olarakda field uzunluğunu ilgili enum üzerinden veriyoruz.

Constructor’da initialize ettiğimiz analyzer ve filtrelerini inceleyelim.

ANALYZER AÇIKLAMA
StandardAnalyzer İngilizce duraksatma kelimelerini kullanarak StandardTokenizer filtreleri ile StandardFilter, LowerCaseFilter ve StopFilter’ı kapsamaktadır.
KeywordAnalyzer İsminden de anlaşılacağı üzere gelen token’ı yani keyword’ü tamamını herhangi bir parçaya ayırmadan kullanmaya yarar. Örneğin belli ürün isimlerinde aramada veya posta kodları aramalarında.
WhitespaceAnalyzer WhitespaceTokenizer’ı kullanır ve text’i boşluklarına ayrır.
StopAnalyzer LetterTokenizer filtreleri ile LowerCaseFilter ve StopFilter’ı içerir.
SimpleAnalyzer LetterTokenizer ve LowerCaseFilter’ı içermektedir.

 

FILTERS AÇIKLAMA
StandardFilter Token’ı normalleştirir. Yani kelimelerdeki kısaltmalar veya belirteçleri kaldırır. (C.E.O = CEO)
LowerCaseFilter Token’ı küçük harflere çevirir.
StopFilter Token üzerindeki kelimeyi duraksatıcı noktalama işaretlerini kaldırır.

Ben örneğimizi StandardAnalyzer kullanarak gerçekleştirdim. Şimdide gelelim LuceneEngine class’ımızın geriye kalan search metot’unun implementasyonuna.

Indexlemiş olduğumuz doküman üzerinde arama yapabilmek için bir QueryParser oluşturuyoruz ve parametre olarak arama yapacak olduğu field‘ı ve arama yapma işleminde de kullanacağı analyzer tipini veriyoruz.

NOT: Dokümanı indexlerken kullanmış olduğunuz analyzer tipini, search işleminde de kullanmanız gerekmektedir. Doğru scoring alabilmek ve sonuçları elde edebilmek adına. Örneğin indexlerken kullanmış olduğunuz analyzer’in birinde StandardFilter olduğunu düşünün. Hatırlarsanız noktalama işaretlerini ve belirli kısaltmaları kaldırıyordu. (C.E.O = CEO) Arama işleminde ise StandardFilter olmadığını varsayarsak ve sizin search için keyword’ünüz eğer C.E.O’ise o dokümanı bulamazsınız.

QueryParser’ı initialize ettikten sonra ise Parse metotu ile Query‘i elde ediyoruz. Daha sonra IndexSearcher sınıfı üzerinden tekrardan initialize ederken constructor üzerinden index işlemi için kullanmış olduğumuz path’i belirtiyoruz ve Search metot’una oluşan Query’i verip, kaç adet sonuç almak istediğimizi belirterek ilgili dokümanlara ulaşabiliyoruz. En uygun sonuçları bize Lucene bir scoring değerleri oluşturarak sıralayıp veriyor.

Search metotunuda oluşturduğumuza göre LuceneEngine sınıfımızın son hali aşağıdaki gibi olacaktır.

Oluşturmuş olduğumuz engine’imizi şimdi kullanımına bir bakalım.

Örnek gereği büyük veriler üzerinde çalışamadım ama eğer sizler büyük boyutlu verilere sahipseniz kesinlikle tavsiye edebileceğim bir kütüphanedir Lucene search engine olarak.

Harika özelliklerinin aksine kötü olarak nitelendirebileceğim tek yanı ise distributed (dağıtık) olarak indexlemeye izin vermemektedir ve arama yapamamaktadır. Fakat bu tarz işler için geliştirilmiş olan Katta isimli teknoloji ile indexler dağıtık olarak kullanılabilir ve search işlemide yapılabilmektedir. Katta’nın workflow’u hakkında bilgi edinmek isterseniz burayı ziyaret edebilirsiniz. Bunun dışında bunlarla uğraşmak istemezseniz ve çok fazla büyük boyutlu verilerim yok küçük boyutlu verilerlede kompleks şekilde sorgular atıp (Scoring işlemleri, Facets’ler, Auto Suggestorler gibi.) search engine kullanmak istiyorum derseniz eğer ElasticSearch‘ü önerebilirim bu noktada. Solr‘yide es geçmemek gerek tabiki.

Aktif olarak şuan ElasticSearch ile çalışmaktayım şirkette. Elastic üzerinde farklı development işlemleri gerçekleştirmekteyim. ElasticSearch de alt yapısında Lucene kullanmaktadır fakat distributed olarak indexleme ve arama işlemlerini desteklemektedir ve daha fazlası.

Umarım faydalı bir makale olmuştur. Örnek proje ektedir.

Herkese iyi search’ler 🙂

LuceneSearchEngine

Bu makale toplam (2878) kez okunmuştur.

22
0



Kategori: .NET Search Engine

Tek Yorum

  1. Chico Goldwire Chico Goldwire

    Merhaba,

    Bir proje için dokümanlar arasında search yapmamız gerekiyor. Biz de araştırma yaparken dokümanı kayıt esnasında indexleyip DB de dokumanın index’ini tutmaya karar verdik.

    Lucene.net ile verdiğiniz örneği inceledik fakat örnekte görebildiğimiz kadarıyla dokümanların indexlenip bir string olarak dönmüyor. Adım Adım sanırım DB ye aktarıyorsunuz.

    Bize dokümanın indexlemesinde index numaraları dahi lazım değil sadece index kelimelerine ihtiyacımız var.

    Bu işlemi nasıl yapabiliriz?

Bir cevap yazın

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

*