Onur Altınsoy Onur Altınsoy
top logo

YAZIŞALIM

KONUŞALIM

542 746 2726

Elasticsearch Did You Mean (Bunu mu Demek İstediniz)

Did you mean (bunu mu demek istediniz) nedir?

Canlı demo için tıklayın
Bir arama motoru yazılımı olan elasticsearch ile did you mean nasıl yapılır? Did you mean yani bunu mu demek istediniz terimi google’da sıkça karşılaştığımız bir cümledir. Yazım hatalarında eksik ya da devrik cümlelerde veya kayda değer sonuç bulunamadığında size yazımı düzeltilmiş sorguyu vermektedir. Komedi virtüözümüz Cem Yılmaz durumu bu şekilde ele almıştır.

Nasıl Çalışır?

Elasticsearch, dünyanın en büyük arama motoru olan Google’ın da kullandığı analiz tekniklerini kullanır, dizindeki içeriği ve aranan kelimeleri bu analyzerlar yardımıyla inceleyerek doğru sorguyu bulma, bir sonraki kelimeyi tahmin etme gibi yetenekler edinir. Sadece içeriği değil sorguları da analiz ettiği için devamlı bir öğrenme durumundadır. Bu analyzerlardan belkide en önemlisi ngram analizidir detaylı bilgiyi yine Google’dan edinebilirsiniz. Fakat did you mean yani bunu mu demek istediniz için biz ngram benzeri farklı bir analyzer kullanacağız.

Önce Ayarlar

Ben servis endpointi olarak localhost kulanacağım, elasticsearch için ücretsiz cluster oluşturabileceğiniz https://bonsai.io/ kullanıyorum.

Evet başlayabiliriz önce indeximizi oluşturarak settings requesti  ve response’u verip sonrasında açıklayacağım

Ne yaptık? Öncelikle indexime myindex adını verdim, json request içinde analyzer için kullanacağım filterları tanımladım, yukarıda bahsetmiş olduğum ngram benzeri analiz tekniği burada tanımlanıyor shingle denilen bu tekniğin ngramdan farkı karakter bazlı değil kelime bazlı olması. Stopwords olarak görülen filter ise analiz için kayda alınmayacak kelimeleri belirlemek için. Daha sonra analyzerlarımı oluşturdum ve tanımladığım filterları ilgili analyzerlara çağırdım burada default analyzer sonuçlar için didyoumean analyzerı ise mevzu bahis konumuz için tanımlandı. Her iki analyzer içinde görülen lowercase filterı global bir filterdır tüm karakterleri küçük istiyoruz. Request sonunda dönen response yukarıdaki gibi ise indeximizi ayarları ile birlikte oluşturduk.

Analiz Testi

shingleın nasıl çalıştığını görmek için tarayıcınıza şu linki yapıştırın

http://localhost:9100/myindex/_analyze?pretty&analyzer=didyoumean&text=java%20neden%20kullanmam%20gerekir

Mapping

Elasticsearchte mappingi mysqlde bir veritabanı tablosunun field yapısı gibi düşünebilirsiniz.

Yukarıda ne yaptık? Mapping ile birlikte typeımızı da oluşturduk, typeın mysqldeki karşılığını tablo olarak düşünebiliriz. Ben mytype olarak belirledim ve burada did_you_mean diye bir field tanımladım analyzer olarak settingste tanımladığımız shingle filterını kullanan didyoumeani kullandım. Daha sonra title ve description için iki alan daha açtım ve copy_to ile bu alanlara girilecek veriyi did_you_mean alanına kopyaladım. Did you mean yani bunu mu demek istediniz sorgusunu bu alan üzerinden yapacağız. Response olarak yukarıdaki sonuç döndüyse mappingi başarılı bir şekilde oluşturmuşuz demektir.

Test Datası Koyalım

Aşağıdaki 4 adet requesti ayrı ayrı myindexe postlayalım

ve Sonuç

Artık arama sorgularına geçebiliriz. Aşağıdaki request “elastikserch” diye bir sorgu atıyor.

Query parametresi title ve descriptiondan default analyzer ile sonuçlarımızı getiriyor, suggestı did you mean (bunu mu demek istediniz) için kullanıyoruz ve shingle analyzerını tanımladığımız did_you_mean fieldını sorguluyoruz.

Response

default analyzer sonuç bulamadı fakat suggesta baktığımızda “elastikserch” sorgusunun opsiyonunun elasticsearch olarak geldiğini görüyoruz. Sonuçları “jaba nedir”,  “rasmus lerdon”, “java nerden” gibi betiklerle test edebilirsiniz.

Canlı demo için tıklayın

Yazıyı Paylaş :

Diğer Yazılar

Bir cevap yazın