Elasticsearch Synonym Yapısı
Selamlar,
Bu yazımda Elasticsearch synonym özelliğinden bahsedeceğim.
Synonym nedir?
Synonym İngilizce’de kelime anlamı olarak “eş anlamlı” demek. Bir kelimenin eş anlamlılarını Elasticsearch’e belirli yollarla ifade ediyoruz ve o kelimelerden herhangi biriyle arama yaptığımızda Elasticsearch bize eş anlamlı kelimelerin tamamıyla aratıp sonucu getiriyor.
Synonym tanımları nasıl yapılır?
Elasticsearch’te oluşturduğumuz index’imizin ve alanlarının özelliklerini belirlediğimiz bir request’imiz var öncelikle bundan bahsetmeliyim. Burada alanlarımızın tipini, “Analyzer” dediğimiz ayarlamaları yapabiliyoruz, synonym tanımlarını da analyzer içinde yapıyoruz. Örneğin index’imizin adı “digigeek” olsun ve local’imizdeki Elasticsearch’te bunu yaptığımızı varsayalım.
Analyzer tanımlamalarını yapmak için öncelikle index’imizi kapatmalıyız, kapatmazsak hata alıyoruz. http://127.0.0.1:9200/digigeek/_close URL’ine POST metoduyla request atarak index’imizi kapatıyoruz ve eğer şu şekilde bir response alırsak başarılı bir işlem yapmış oluyoruz.
{
"acknowledged": true,
"shards_acknowledged": true,
"indices": {
"digigeek": {
"closed": true
}
}
}
Şimdi analyzer içinde synonym tanımlarına geçebiliriz. Burada 2 çeşit tanım yapabiliriz. 1.si :
http://127.0.0.1:9200/digigeek/_settings URL’ine PUT metoduyla şu şekilde bir request atabiliriz.
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "lowercase",
"filter": [ "synonym" ]
}
},
"filter": {
"synonym": {
"type": "synonym",
"synonyms": ["dil, lisan","fayda, yarar"]
}
}
}
}
}
}
Burada Elasticsearch’e biz dil ve lisan kelimesinin, fayda ve yarar kelimesinin eş anlamlı olduğunu bildirmiş oluyoruz. Bu durumda dil kelimesi ile arama yaptığımızda içinde lisan geçen sonuçlar da bize gelmiş olacak. Bu tip bir tanımlamayı eğer çok fazla eş anlamlı kelime grubunuz varsa tavsiye etmem. Bunun için daha güzel bir yol var :)
Bir text dosyası açıp buraya tüm eş anlamlı kelimeleri belirli bir formatta ekleyebiliriz. Formatımız şu şekilde olmalı, adına da synonym.txt diyelim.
dil, lisan
fayda, yarar
iphone, ayfon
cevap, yanıt
Bu şekilde istediğimiz kadar eş anlamlı kelime tanımlayabiliriz. Analyzer tanımını yapmak için ise ilk attığımız request’te eş anlamlı kelimeleri belirtmek yerine text dosyamızın path’ini göndereceğimiz küçük bir değişikliğimiz var, URL ve metod yine aynı.
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "lowercase",
"filter": [ "synonym" ]
}
},
"filter": {
"synonym": {
"type": "synonym",
"synonyms_path": "analysis/synonym.txt"
}
}
}
}
}
}
Bu request’i çalıştırmadan önce oluşturduğumuz synonym.txt dosyamızı local’imizde veya sunucumuzda Elasticsearch’ün kurulu olduğu klasöre gidip içinde analysis isimli yeni bir klasör açıp onun içine kopyalamalıyız ve ondan sonra request’imizi çalıştırmalıyız. Bir de ipucu vereyim. Eğer Elasticsearch’ün kurulu olduğu klasörü tam olarak bilemiyorsak bu request’i çalıştırdığımızda burada bu dosyayı bulamadım diye bir hata response’u göreceksiniz ve orada da text dosyamızı nereye atmanız gerektiğini görebilirsiniz.
Eğer şu sonucu görüyorsak synonym tanımımız başarıyla oluşmuştur demektir.
{
"acknowledged": true
}
Bu adımdan sonra index’imizi tekrar açmamız gerekiyor.
http://127.0.0.1:9200/digigeek/_open URL’ine POST metoduyla request atıyoruz.
Bundan sonra son bir adımımız kalıyor o da arama yaparken synonym isimli analyzer’ımı kullanmak istiyorum diye Elasticsearch’e belirtmek. Örnek bir arama request’i atalım.
http://127.0.0.1:9200/digigeek/_search URL’ine GET metodu ile şu request’i gönderelim.
{
"query": {
"multi_match" : {
"query": "lisan",
"fields": [ "title" ], "analyzer" : "synonym"
}
}
}
Bu response’ta bize “title” alanında “lisan” ve analyzer tanımı yaparken eş anlamlısı olduğunu belirttiğimiz “dil” kelimeleri geçen sonuçlar gelecek.
Bu kadar basit bir şekilde istediğimiz kadar kelime grubunu eş anlamlı olarak tanımlayarak arama motorumuzun çok daha efektif çalışmasını sağlayabiliriz.