Merhabalar,
Bu yazımda sizlere elasticsearch'teki alias olayını aktaracağım. Diyelim ki biz yeni bir index oluşturduk. Bu index'imizin ismi diğer eski index'ten farklı olmak zorunda. Ve _reindex yaptık. _reindex olayını anlamak için buraya tıklayabilirsiniz. Fakat şöyle bir sorunumuzun olduğunu gördük. Eski indeximizin ismini birkaç yerde kullanmışız. Ve tekrar tekrar değiştirmek bize zor geliyor. İşte burada imdadımıza _alias yetişiyor. İlk olarak eski indeximizi siliyoruz. Silme işlemi için şu adresten yararlanabilirsiniz. Daha sonra ise alias ile eski index'imizin adını yeni index'imize atıyoruz. Böylece dışardan eski index'imizin ismiyle yeni index'imize bağlanmış oluyoruz.
POST _aliases
{
"actions": [
{
"add": {
"index": "yeni_index_imiz",
"alias": "eski_index_imizin_adi"
}
}
]
}
Diyelimki bu yeni index'imizden sonra da yeni bir index ekledik. İşte bu noktada bu aliasla eklediğimiz ismimizi yeni index'imize taşımamız gerekiyor. Bunu da şu şekilde yapıyoruz.
POST _aliases
{
"actions": [
{
"remove": {
"index": "yeni_index_imiz",
"alias": "eski_index_imizin_adi"
}
},
{
"add": {
"index": "yeni_index_imiz_2",
"alias": "eski_index_imizin_adi"
}
}
]
}
Burada işte remove ile kaldırıp yerine tekrardan add ile ekleme yapıyoruz. İnşaallah faydalı bir yazı olmuştur. Allah'a emanet olun.
15 Ağustos 2018 Çarşamba
Elasticsearch ile Index ve Kayıt Silme ve Kayıt Güncelleme İşlemi
Merhabalar,
Bu yazımızda elasticsearch ile kayıt ve index silme yöntemini göreceğiz. Ayrıca kayıt güncelleme işleminede bakacağız.
DELETE silecegimiz_index
DELETE indeximiz/urunler_type/silecegimiz_kaydin_id_si
Bu işlemlerde dikkatli olalım. Geri dönemeyeceğimiz zararlarımız olabilir. Yedek falan vs alıp sonra bu işlemlerimizi halledelim.
Şimdi ise kayıt güncelleme işlemimize bakalım.
POST indeximiz/urunler_type/guncellenecek_kaydin_id_si
{
"name" :"Fare",
"category":"Teknoloji",
"price":1000,
"city" : "İstanbul"
}
Bu şekilde kaydımızın tamamını güncelleme imkanı buluyoruz. Şimdi ise bir kaydın sadece bir yada iki alanını nasıl güncelleriz ona bakacağız. Yukardaki gibi eğer yapmaya kalkarsak yani sadece güncelleyeceğimiz alanları yukarıya yazarsak kaydımız gider. Yukarısı parçalı güncelleme için değil tüm alanları güncelleme için kullanılır.
POST indeximiz/urunler_type/guncellenecek_kaydin_id_si/_update
{
"doc": {
"name": "Fare-Mouse",
"category": "bilgisayar",
"sku": "İYRS"
}
}
Bu şekilde parçalı güncelleme (partial update) yapabiliriz. Burada şunu söyleyeyim. id'den sonra gelen _update'yi yukarıda yazarsak hata alırız. Çünkü bu özellik doc kısmı ile çalışıyor.
Bu yazımızda elasticsearch ile kayıt ve index silme yöntemini göreceğiz. Ayrıca kayıt güncelleme işleminede bakacağız.
DELETE silecegimiz_index
DELETE indeximiz/urunler_type/silecegimiz_kaydin_id_si
Bu işlemlerde dikkatli olalım. Geri dönemeyeceğimiz zararlarımız olabilir. Yedek falan vs alıp sonra bu işlemlerimizi halledelim.
Şimdi ise kayıt güncelleme işlemimize bakalım.
POST indeximiz/urunler_type/guncellenecek_kaydin_id_si
{
"name" :"Fare",
"category":"Teknoloji",
"price":1000,
"city" : "İstanbul"
}
Bu şekilde kaydımızın tamamını güncelleme imkanı buluyoruz. Şimdi ise bir kaydın sadece bir yada iki alanını nasıl güncelleriz ona bakacağız. Yukardaki gibi eğer yapmaya kalkarsak yani sadece güncelleyeceğimiz alanları yukarıya yazarsak kaydımız gider. Yukarısı parçalı güncelleme için değil tüm alanları güncelleme için kullanılır.
POST indeximiz/urunler_type/guncellenecek_kaydin_id_si/_update
{
"doc": {
"name": "Fare-Mouse",
"category": "bilgisayar",
"sku": "İYRS"
}
}
Bu şekilde parçalı güncelleme (partial update) yapabiliriz. Burada şunu söyleyeyim. id'den sonra gelen _update'yi yukarıda yazarsak hata alırız. Çünkü bu özellik doc kısmı ile çalışıyor.
Elasticsearch'te Var Olan Bir Index'teki Verileri Yeni Index'e Kopyalama Yani _reindex Olayı
Merhabalar;
Bu yazımızda elasticsearch ile varolan bir index'imizin datalarını yeni oluşturduğumuz index'e aktarım işlemine bakacağız. Burada dikkat etmemiz gereken noktalar şunlardır.
İlk olarak yeni oluşturacağımız index'imizin mapping'teki type'ları aynı olmalı. Misal olarak long tipini text olarak dönüştürmemeliyiz. Yada text tipini int'e dönüştürmemeliyiz. Bir _reindex görelim şimdi.
POST /_reindex
{
"source": {
"index": "ilk_indeximiz"
},
"dest": {
"index": "ikinci_indeximiz"
}
}
Buradaki source kısmı bizin kaynak indeximiz oluyor yani verimizi alacağımız index. Dest ise destination'dan gelen bir kısaltma olup hedef index anlamındadır. Burayada verilerimizi hangi indeximize aktaracak isek o indeximizin ismini yazıyoruz.
Bu yazımızda elasticsearch ile varolan bir index'imizin datalarını yeni oluşturduğumuz index'e aktarım işlemine bakacağız. Burada dikkat etmemiz gereken noktalar şunlardır.
İlk olarak yeni oluşturacağımız index'imizin mapping'teki type'ları aynı olmalı. Misal olarak long tipini text olarak dönüştürmemeliyiz. Yada text tipini int'e dönüştürmemeliyiz. Bir _reindex görelim şimdi.
POST /_reindex
{
"source": {
"index": "ilk_indeximiz"
},
"dest": {
"index": "ikinci_indeximiz"
}
}
Buradaki source kısmı bizin kaynak indeximiz oluyor yani verimizi alacağımız index. Dest ise destination'dan gelen bir kısaltma olup hedef index anlamındadır. Burayada verilerimizi hangi indeximize aktaracak isek o indeximizin ismini yazıyoruz.
Elasticsearch ile Template Kullanımı - Params - Template
Merhabalar,
Bu
yazımızda elasticsearch ile query yaparken template kullanımını
göreceğiz. Bu kullanım ile beraber bizler daha kısa yoldan
sorgularımızı yapabileceğiz.
{
"params": {
"query": "Mazhar",
"query2": "Mehmet Ali"
},
"source": {
"query": {
"bool": {
"should": [
{
"match": {
"first_name": {
"query": "{{query}}"
}
}
},
{
"match": {
"first_name": {
"query": "{{query2}}"
}
}
}
]
}
}
}
}
Burada
dikkat edilmesi gereken nokta query’nin eşitine yazılan sorgu iki
süslü parantez içerisine yazılmasıdır. Yukarısında params ile
parametrelerini belirledik. Daha sonra ise bu belirlediğimiz
parametreleri kullanacağımız alanlar için source kısmını açıp
içerisine sorgularımızı yazdık ve kullandık. İlk satırda
_search/template diye yazmamız gerekir ki bu yapıyı
kullanabilelim.
İnşaallah
faydalı bir yazı olmuştur. Herkese kolay gelsin. Başarılar
dilerim.
7 Ağustos 2018 Salı
Elasticsearch Synonym Token Filter
Merhabalar,
Bu yazımda inşaallah Synonym kelimeleri yani eşanlamlı yada aranılabilir bazı kelimelerin istediğimiz yada belirlediğimiz kelime yada kelime grupları şeklinde aranmasını isteyebiliriz. Bu durumda işte kullanacağımız şey synonym kelimelerdir. Bu kelimeleri kullanırken dikkat etmemiz gereken önemli bir nokta var. Birden fazla kelime yani cümle şeklinde olan kelimeleri girmemek. Çünkü arama yaparken en uzun kelimeyi bulup ona göre arama yaptığından dolayı biz böyle cümleleri önermiyoruz. Misal olarak, arı balı, çiçek balı dedik. Bakın burada iki kelimelik gruplarımız var. Bunları işte düzeltmemiz gerekiyor. Arı balı değil de arı, bal, balı, çiçek, balı şeklinde.
Bu yazımda inşaallah Synonym kelimeleri yani eşanlamlı yada aranılabilir bazı kelimelerin istediğimiz yada belirlediğimiz kelime yada kelime grupları şeklinde aranmasını isteyebiliriz. Bu durumda işte kullanacağımız şey synonym kelimelerdir. Bu kelimeleri kullanırken dikkat etmemiz gereken önemli bir nokta var. Birden fazla kelime yani cümle şeklinde olan kelimeleri girmemek. Çünkü arama yaparken en uzun kelimeyi bulup ona göre arama yaptığından dolayı biz böyle cümleleri önermiyoruz. Misal olarak, arı balı, çiçek balı dedik. Bakın burada iki kelimelik gruplarımız var. Bunları işte düzeltmemiz gerekiyor. Arı balı değil de arı, bal, balı, çiçek, balı şeklinde.
Evet, synonym kullanabilmemiz için öncelikle index oluşturmamız
gerekiyor. Adı üstünde synonym token filter. Yani bu filtreler index oluşturulurken
tanımlanır ve kullanılır. Evet şimdi indeximizi oluşturuyoruz.
PUT yeniindex
{
"settings" : {
"index" :{
"number_of_shards" :
"3",
"number_of_replicas" : 1},
"analysis" : {
"analyzer" : {
"synonym_analyzer" : {
"tokenizer" :
"standard",
"filter" :
"synonymFilter"
}
},
"filter" : {
"synonymFilter" : {
"type" :"synonym",
"synonyms" :
["fare,mouse","keyboard,klavye"]
}
}
}
},
"mappings" : {
"urunler" : {
"properties" : {
"urun_ismi" : {
"type" : "text",
"analyzer"
: "synonym_analyzer"
}
}
}
}
}
Şunu belirteyim. Analyzer’ı mapping oluştururken de
tanımlayabiliriz ya da sorgu yaparken analyzer deyip ismini girerekte kullanabiliriz.
Ayrıca synonym kelimelerimizi ayrı bir txt dosyası oluşturup “synonyms” yerine “synonyms_path”
diye belirterek elasticsearch.yml’nin bulunduğu klasöre bir klasör açıp
içerisine synonym.txt i yerleştirip yolunu belirtebiliriz. Misal olarak
synonyms/synonym.txt şeklinde olabilir.
Synonym txt oluştururken genel olarak şunlara dikkat etmek gerekir.
Eşanlamlı kelimeleri yan yana ve aralarına virgül konulur. fare, mouse gibi. Bir alt satıra geçerek ikinci synonym kelime yazılır.
Eşanlamlı kelimeleri yan yana ve aralarına virgül konulur. fare, mouse gibi. Bir alt satıra geçerek ikinci synonym kelime yazılır.
mouse, fare
klavye, keyboard
klavye, keyboard
gibi.
Bir diğer noktada bir kelime aratılırken o kelimenin aranmamasını isteyebiliriz. Bunun için ise şöyle bir metod kullanılır.
Bir diğer noktada bir kelime aratılırken o kelimenin aranmamasını isteyebiliriz. Bunun için ise şöyle bir metod kullanılır.
mouse => fare
keyboard => klavye
keyboard => klavye
PUT yeniindex
{
"settings" : {
"index" :{
"number_of_shards" :
"3",
"number_of_replicas" : 1},
"analysis" : {
"analyzer" : {
"synonym_analyzer" : {
"tokenizer" :
"standard",
"filter" :
"synonymFilter"
}
},
"filter" : {
"synonymFilter" : {
"type" :"synonym",
"synonyms_path"
: “synonyms_kelimeler/synonym.txt”,
}
}
}
},
"mappings" : {
"urunler" : {
"properties" : {
"urun_ismi" : {
"type" : "text",
"analyzer" :
"synonym_analyzer"
}
}
}
}
}
Bir örnek yapalım.
GET
yeniindex/_analyze
{
"analyzer":
"synonym_analyzer",
"text": ["klavye
getir","fare ile oynama"]
}
Burası analiz edeceğimiz kısım. Dönen sonuç aşağıda…
{
"tokens": [
{
"token": "klavye",
"start_offset": 0,
"end_offset": 6,
"type":
"<ALPHANUM>",
"position": 0
},
{
"token": "keyboard",
"start_offset": 0,
"end_offset": 6,
"type": "SYNONYM",
"position": 0
},
{
"token": "getir",
"start_offset": 7,
"end_offset": 12,
"type":
"<ALPHANUM>",
"position": 1
},
{
"token": "fare",
"start_offset": 13,
"end_offset": 17,
"type":
"<ALPHANUM>",
"position": 102
},
{
"token": "mouse",
"start_offset": 13,
"end_offset": 17,
"type": "SYNONYM",
"position": 102
},
{
"token": "ile",
"start_offset": 18,
"end_offset": 21,
"type":
"<ALPHANUM>",
"position": 103
},
{
"token": "oynama",
"start_offset": 22,
"end_offset": 28,
"type":
"<ALPHANUM>",
"position": 104
}
]
}
2 Ağustos 2018 Perşembe
Elasticsearch Boost Olayı
Merhabalar,
Şimdiye kadar biz nasıl sorgulama yapılacağını önceki yazılarımızda az çok paylaşmıştık. Şimdi ise sizlere boost olayından bahsetmek istiyorum. Boost olayı tanımladığımız sorgunun aldığı score değerinin çarpanıdır. Bu olay compound sorgularda yani birleşik sorgularda oldukça işe yarar. Diyelimki bir bool sorgusu kullandık. İçerisinde birden fazla sorgumuz var. Sorgulardan herhangi birinin sonucunun daha üst sıralarda çıkmasını istiyoruz. İşte burada bizim vermemiz, kullanmamız gereken olayımız boost olayıdır. Bu belgelerimiz aldığı score’u verdiğimiz sayıyla çarpar ve daha üst ya da alt sıralara yerleştirir. Biz burada 0 ve 1 arasında değer verirsek score küçülür. 1 den fazla değer verirsek eğer score’umuz büyür. Şöyle bir durum var. Boost değerleri birbirine çok yakın olursa istediğimiz sonuçlar çıkmayabilir. Çünkü score değeri arkaplanda birçok faktöre bağlıdır. Bu yüzden belirlediğimiz boost değerini dikkatlice ve aralarını da bu faktörleri göz önünde bulundurarak seçmek gerekir. Bir örnek yapalım.
Şimdiye kadar biz nasıl sorgulama yapılacağını önceki yazılarımızda az çok paylaşmıştık. Şimdi ise sizlere boost olayından bahsetmek istiyorum. Boost olayı tanımladığımız sorgunun aldığı score değerinin çarpanıdır. Bu olay compound sorgularda yani birleşik sorgularda oldukça işe yarar. Diyelimki bir bool sorgusu kullandık. İçerisinde birden fazla sorgumuz var. Sorgulardan herhangi birinin sonucunun daha üst sıralarda çıkmasını istiyoruz. İşte burada bizim vermemiz, kullanmamız gereken olayımız boost olayıdır. Bu belgelerimiz aldığı score’u verdiğimiz sayıyla çarpar ve daha üst ya da alt sıralara yerleştirir. Biz burada 0 ve 1 arasında değer verirsek score küçülür. 1 den fazla değer verirsek eğer score’umuz büyür. Şöyle bir durum var. Boost değerleri birbirine çok yakın olursa istediğimiz sonuçlar çıkmayabilir. Çünkü score değeri arkaplanda birçok faktöre bağlıdır. Bu yüzden belirlediğimiz boost değerini dikkatlice ve aralarını da bu faktörleri göz önünde bulundurarak seçmek gerekir. Bir örnek yapalım.
{
"query": {
"bool": {
"should": [
{
"match": {
"first_name.textSearchField": {
"query":
"ahmet",
"boost": 1.27
}
}
},
{
"match": {
"first_name.textSearchField": {
"query":
"hasan",
"boost": 1
}
}
}
]
}
}
}
Burada ben
çalıştığım veriler arasında “Ahmet” isminin ön plana çıkması için 1.27 boost
değerinden daha düşük değer veremedim. Elbette alttaki “Hasan” değerinin boost
değerini 1 yaparsak oluyor. Ancak 1 den küçük değerlerlede işimizi kolayca
halledebilirdik. Daha ayrıntılı bilgi için https://www.elastic.co/guide/en/elasticsearch/reference/6.3/mapping-boost.html
adresini ziyaret edebilirsiniz.
1 Ağustos 2018 Çarşamba
Elasticsearch Bool Query - Must
Merhaba,
Bu yazımızda Bool Query’sinden Must olayını anlatmaya çalışacağım. Daha önceki yazımda bahsettiğim Bool Query’sinde bu olayımız “and” mantığıyla çalışmakta. Yani içerisinde tanımlanmış sorguların hepsinden bir sonuç dönmesini bekliyoruz. Yoksa şartlar sağlanmadığından query’miz sıfır sonuçla geri döner. Hemen bir örnekle başlayalım ve nasıl kullanıldığını görelim.
Bu yazımızda Bool Query’sinden Must olayını anlatmaya çalışacağım. Daha önceki yazımda bahsettiğim Bool Query’sinde bu olayımız “and” mantığıyla çalışmakta. Yani içerisinde tanımlanmış sorguların hepsinden bir sonuç dönmesini bekliyoruz. Yoksa şartlar sağlanmadığından query’miz sıfır sonuçla geri döner. Hemen bir örnekle başlayalım ve nasıl kullanıldığını görelim.
{
"query": {
"bool": {
"must": [
{
"match": {
"first_name": "Ahmed
Emin"
}
},
{
"match_phrase": {
"last_name":
"Maraşlı"
}
}
]
}
}
}
Görüldüğü gibi should olayıyla aynı kullanıma sahipler. Fakat must
olayında “minimum_should_match” kullanımı birşeyi değiştirmez.
Elasticsearch Bool Query - Should
Merhabalar,
Elasticsearch’te bool query’lerinden should’u işleyeceğiz. Bool query’leri birkaç alanda özelleşmiş sorgular oluşturmak için kullanılır. Misal olarak bir alanda Match sorgusunu diğer bir alanda ise Match Phrase sorgusunu çalıştırmak istiyoruz. Diğer bir alanda ise Term query’yi çalıştırmak istiyoruz. Aslında biz bir şey aramak istediğimizde nerelere bakıp ne şekilde arama yapmasını istiyorsak bool query’lerini kullanmalıyız. Bool query’leri “and”, “or”, “not” mantık kuralına göre çalışırlar. Should bunlardan “or” kuralını ihtiyar etmiştir. Should kısmına yazdığımız her sorgudan en az biri veya birkaçı getirilir. Biz “minimum_should_match” olayıyla bir alt sınır belirlersek en az o kadar alanın eşleme yaptığı sorgu sonuçlarını getirir.
Elasticsearch’te bool query’lerinden should’u işleyeceğiz. Bool query’leri birkaç alanda özelleşmiş sorgular oluşturmak için kullanılır. Misal olarak bir alanda Match sorgusunu diğer bir alanda ise Match Phrase sorgusunu çalıştırmak istiyoruz. Diğer bir alanda ise Term query’yi çalıştırmak istiyoruz. Aslında biz bir şey aramak istediğimizde nerelere bakıp ne şekilde arama yapmasını istiyorsak bool query’lerini kullanmalıyız. Bool query’leri “and”, “or”, “not” mantık kuralına göre çalışırlar. Should bunlardan “or” kuralını ihtiyar etmiştir. Should kısmına yazdığımız her sorgudan en az biri veya birkaçı getirilir. Biz “minimum_should_match” olayıyla bir alt sınır belirlersek en az o kadar alanın eşleme yaptığı sorgu sonuçlarını getirir.
{
"query": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"match": {
"first_name":
"Yılmaz"
}
},
{
"match_phrase": {
"last_name":
"Yılmaz"
}
}
]
}
}
}
Açıklamak gerekirse adı Yılmaz veya soyadı Yılmaz veya adı ve
soyadı Yılmaz olanların listesini getirmesini söylüyoruz. “minimum_should_match”
2 olsaydı hem adı hem soyadı Yılmaz olanların listesini getirmesini istemiş
olurduk. Burada şunu söyleyeyim. Ad ve Soyad kısmında Yılmaz geçecek. Sadece
Yılmaz olanları getir demiyoruz. Sadece Yılmaz olanları getir demek için “term”
sorgusu kullanmamız gerekirdi. Aşağıda bir sorgu veriyorun. Onu da siz yorumlayın.
{
"query": {
"bool": {
"minimum_should_match": 0,
"should": [
{
"match": {
"first_name": "Ahmed
Emin"
}
},
{
"match_phrase": {
"last_name":
"Maraşlı"
}
},
{
"match": {
"city":
"Kahramanmaraş"
}
}
]
}
}
}
Elasticsearch Match phrase query örnekleri
Merhabalar,
Bu yazımızda Match Phrase Query’i keşfetmeye çalışacağız. Bu query’miz full text query’lerindendir. Bu query aranılan cümleyi sıralamaya uyarak arar. Hani Match query’miz bize aranılan cümledeki kelimelerin metinde varlığını kontrol edip o şekilde arıyordu. İşte bu sorgu türü de ondan farklı olarak bütün yazdığımız ifadeyi sıralamaya uyarak bütün kelimelerin var olup olmadığına bakar ve ona göre sonuç döndürür. Örneklerle devam edelim.
Bu yazımızda Match Phrase Query’i keşfetmeye çalışacağız. Bu query’miz full text query’lerindendir. Bu query aranılan cümleyi sıralamaya uyarak arar. Hani Match query’miz bize aranılan cümledeki kelimelerin metinde varlığını kontrol edip o şekilde arıyordu. İşte bu sorgu türü de ondan farklı olarak bütün yazdığımız ifadeyi sıralamaya uyarak bütün kelimelerin var olup olmadığına bakar ve ona göre sonuç döndürür. Örneklerle devam edelim.
{
"query": {
"match_phrase": {
"ad_ve_soyad": "Ahmed Hüseyin
TUNÇ"
}
}
}
Ayrıca bu kullanımın diğer bir versiyonu daha var.
{
"query": {
"match": {
"ad_ve_soyad": {
"query" : "Ahmed Hüseyin TUNÇ",
"type" : "phrase"
}
"query" : "Ahmed Hüseyin TUNÇ",
"type" : "phrase"
}
}
}
}
Bu şekilde arama yapabiliyoruz. Burada dikkat etmemiz gereken şey
ne ararsak arayalım sıralamaya göre çıkacak olmasıdır. Ve sıralamanında
aralarına kelime vs giremez. Örneğin Ahmed Muhammed Hüseyin TUNÇ gelmez. Buna dikkat
edelim.30 Temmuz 2018 Pazartesi
Elasticsearch Match Query Örnekleri
Merhabalar,
Bu yazımda inşaallah Match Query ile ilgili örnekler yapacağım. Faydalı olması dileğiyle…
Bu yazımda inşaallah Match Query ile ilgili örnekler yapacağım. Faydalı olması dileğiyle…
İlk önce basit bir Match
Query’si yapalım.
{
“query” : {
“match” : {
“ALAN_ISMI” : “Aranacak kelime ya da cümle”
}
}
}
“query” : {
“match” : {
“ALAN_ISMI” : “Aranacak kelime ya da cümle”
}
}
}
Burada arkadaşlar Alan_ismi
yerine hangi alanda sorgu yapmak istiyorsak onu yazıyoruz. Yanında ki iki
noktadan sonra ise arayacağımız kelime ya da cümlelerimizi arıyoruz. Match sorgusunun çalışma prensibini
önceki yazılarımda paylaşmıştım. Bu yazımda da kısaca bahsedeyim. Aranılan kelime ya da cümleyi kelimelere
bölerek bunları gruplar. Daha sonra bu grup içinden arama yapar. Aradığımız şey
şu cümle olsun : “Bismillah her hayrın
başıdır.” Burada şu gruplara bölünür cümlemiz; “Bismillah”, “her”, “hayrın”, “başıdır” şeklinde kelimelere ayırır. Daha sonra ise bu kelimelerin
bulunduğu her bir dökümana bir skor atar. Ne kadar çok kelime bulursa o kadar
skor ataması yapılır. Bu da bize aradığımız doküman nesnesinin daha öne
çıkmasına sebep olur. Burada şunu belirteyim. Aradığımız cümledeki kelimeleri
“or” mantık operatörüyle bulmaya çalışır. Yani ya “Bismillah”, ya “her”, ya
“hayrın”, ya “başıdır”, ya “Bismillah
başıdır”, ya “her hayrın” vs.
gibi. Ve bütün bu sonuçları ekrana getirir.
İkinci bir örnek yapalım.
{
“query” : {
“match” : {
“ALAN_ISMI” : {
“query” : “Aranılan kelime ya da cümle”,
“minimum_shoul_match” : 2
}
}
}
}
“query” : {
“match” : {
“ALAN_ISMI” : {
“query” : “Aranılan kelime ya da cümle”,
“minimum_shoul_match” : 2
}
}
}
}
Burada arkadaşlar daha önce tek kelimelerin bulunduğu dökümanları
listelerken artık “minimum_should_match” ten dolayı listelemeyecektir. En az
iki kelimenin eşleştiği kelimeleri getirecektir. Mesela; “Bismillah her”,
“hayrın başıdır”, “her hayrın” vs. Tabi üç, dört ve daha fazla eşleşmeleride
getirecektir.
Üçüncü bir örneğe bakalım.
{
“query” : {
“match” : {
“ALAN_ISMI” : {
“query” : “Aranacak kelime ya da cümle”,
“operator” : “and”
}
}
}
}
“query” : {
“match” : {
“ALAN_ISMI” : {
“query” : “Aranacak kelime ya da cümle”,
“operator” : “and”
}
}
}
}
Buradaki durumda ise “operator”
özelliğine “and” operatörünü
atadığımızda artık bize dönen sonuçlarda bütün kelimelerin geçmesini istemiş
oluyoruz. Şunu ekleyeyim arkadaşlar. Burada sıra önemsizdir. Match sorgusu
kelime bazında çalıştığından dolayı sıra önemsenmez. Sıranın önemsendiği
sorgulara ayrıca bakacağız inşaallah.
Şimdi başka bir örneğe geçelim.
{
“query” : {
“match” : {
“ALAN_ISMI” : {
“query” : “Aranılan kelime yada cümle”,
“fuzziness” : 1
}
}
}
}
“query” : {
“match” : {
“ALAN_ISMI” : {
“query” : “Aranılan kelime yada cümle”,
“fuzziness” : 1
}
}
}
}
Evet geldik
yeni bir özelliğimize. Fuzziness özelliği tolerans değerimizdir. Burada
belirttiğimiz değer kadar her kelimede harf toleransı gösterir. Biz burada bir
harf tolerans göstermesini söyledik. Aradığımız kelime ya da cümlelerin her
kelimesinde bir harf tolerans gösterip sorguyu buna göre bize gösterir. Mesela
aradığımız şey; “anı paylaşalım” cümlesi olsun. Sonuçlarımızda “arı” kelimesini
görebiliriz. Çünkü “n” harfini bir tolera edip “r” diye gösterdi. Fuzziness
hakkında detaylı bilgi almak için elastic.co
adresini ziyaret edebilirsiniz.
26 Temmuz 2018 Perşembe
Elasticsearch Yeni Kayıt Ekleme
Merhabalar,
Daha önceki yazımda sizlere index ve mapping oluşturmayı tarif etmeye çalışmıştık. Bu yazımızda ise daha önce oluşturduğumuz index'imize yeni bir kayıt nasıl eklenir onu göreceğiz inşaallah.
POST yeniindex/kisiler
{
"kisi_ad" : "Mazhar",
"kisi_soyad" : "SELVİTOPİ",
"kisi_tc_no" : "12384159967",
"kisi_resim_URL" :"img/mazhar.png"
}
Bu şekilde yeni bir kayıt ekleyebiliyoruz. Dikkat etmemiz gereken önemli bir nokta var. Onun için aşağıdaki kayıt yöntemine de bakınız.
PUT yeniindex/kisiler/2
{
"kisi_ad" : "Mustafa",
"kisi_soyad" : "ALGAN",
"kisi_tc_no" : "24578965854",
"kisi_resim_URL" :"img/mustafa.png"
}
Değişikliği farkettiniz mi? POST yerine PUT kullandık. Ve ayrıca ilk eklediğimiz kaydımıza _id değeri vermemiştik. Fakat bunda verdik. Bir sorgu ile bu kayıtlarımızı alıyoruz şimdi.
"hits": [
{
"_index": "yeniindex",
"_type": "kisiler",
"_id": "AWTWNUvkp1RDTOEOnvXh",
"_score": 1,
"_source": {
"kisi_ad": "Mazhar",
"kisi_soyad": "SELVİTOPİ",
"kisi_tc_no": "12384159967",
"kisi_resim_URL": "img/mazhar.png"
}
},
{
"_index": "yeniindex",
"_type": "kisiler",
"_id": "2",
"_score": 1,
"_source": {
"kisi_ad": "Mustafa",
"kisi_soyad": "ALGAN",
"kisi_tc_no": "24578965854",
"kisi_resim_URL": "img/mustafa.png"
}
}
]
Evet işte burada _id alanımızın ilkinde rasgele bir değer, ikincisinde ise bizim atadığımız değerimiz yer alıyor. Arkadaşlar burdaki dikkat etmemiz gereken şeyimiz PUT ve POST metodunun farkını anlatmaktı. PUT metodu rasgele _id değeri atarken POST'ta ise biz _id değeri veriyoruz. Bir diğer husus ise güncelleme yaparken POST metodunu kullanmamız. Bu hususu ise daha sonraki yazımda anlatacağım inşaallah. Bol okumalar.
Daha önceki yazımda sizlere index ve mapping oluşturmayı tarif etmeye çalışmıştık. Bu yazımızda ise daha önce oluşturduğumuz index'imize yeni bir kayıt nasıl eklenir onu göreceğiz inşaallah.
POST yeniindex/kisiler
{
"kisi_ad" : "Mazhar",
"kisi_soyad" : "SELVİTOPİ",
"kisi_tc_no" : "12384159967",
"kisi_resim_URL" :"img/mazhar.png"
}
Bu şekilde yeni bir kayıt ekleyebiliyoruz. Dikkat etmemiz gereken önemli bir nokta var. Onun için aşağıdaki kayıt yöntemine de bakınız.
PUT yeniindex/kisiler/2
{
"kisi_ad" : "Mustafa",
"kisi_soyad" : "ALGAN",
"kisi_tc_no" : "24578965854",
"kisi_resim_URL" :"img/mustafa.png"
}
Değişikliği farkettiniz mi? POST yerine PUT kullandık. Ve ayrıca ilk eklediğimiz kaydımıza _id değeri vermemiştik. Fakat bunda verdik. Bir sorgu ile bu kayıtlarımızı alıyoruz şimdi.
"hits": [
{
"_index": "yeniindex",
"_type": "kisiler",
"_id": "AWTWNUvkp1RDTOEOnvXh",
"_score": 1,
"_source": {
"kisi_ad": "Mazhar",
"kisi_soyad": "SELVİTOPİ",
"kisi_tc_no": "12384159967",
"kisi_resim_URL": "img/mazhar.png"
}
},
{
"_index": "yeniindex",
"_type": "kisiler",
"_id": "2",
"_score": 1,
"_source": {
"kisi_ad": "Mustafa",
"kisi_soyad": "ALGAN",
"kisi_tc_no": "24578965854",
"kisi_resim_URL": "img/mustafa.png"
}
}
]
Evet işte burada _id alanımızın ilkinde rasgele bir değer, ikincisinde ise bizim atadığımız değerimiz yer alıyor. Arkadaşlar burdaki dikkat etmemiz gereken şeyimiz PUT ve POST metodunun farkını anlatmaktı. PUT metodu rasgele _id değeri atarken POST'ta ise biz _id değeri veriyoruz. Bir diğer husus ise güncelleme yaparken POST metodunu kullanmamız. Bu hususu ise daha sonraki yazımda anlatacağım inşaallah. Bol okumalar.
Elasticsearch'te Index ve Mapping Oluşturma
Merhabalar,
Bu yazımızda inşaallah elasticsearch'te index oluşturacağız.
PUT yeniindex
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"kisiler": {
"properties": {
"kisi_ad": {
"type": "text"
},
"kisi_soyad": {
"type": "text"
},
"kisi_tc_no": {
"type": "long"
},
"kisi_resim_URL": {
"type": "keyword"
}
}
},
"kitaplar": {
"properties": {
"kitap_ismi": {
"type": "text"
},
"kitap_ISBN": {
"type": "keyword"
}
}
}
}
}
Arkadaşlar burada ilk önce "settings" kısmı ile yeni indeximizin ayarlamalarını yapıyoruz. Daha sonra ise "mappings" ile dökümanlarımızın nasıl tutulacağını belirtiyoruz. Burada dikkat etmemiz gereken önemli noktaları sıralayayım. İlk önce verimizin hangi bölümleri için analiz yapılıp yapılmayacağını belirliyoruz. Ben burada kisi_ad, kisi_soyad ve kitap_ismi için analiz yapılmasını istiyorum. Analiz yapılmasını istediğim alanlar için type tanımlaması olarak text kullanıyoruz. Eğer analiz yapılmasını istemiyorsak keyword tipini seçebiliriz. Zaten sayısal veri türü için bir analiz yapılması söz konusu değil. İlerde yeni bir index tanımlaması yapacağız. Bundan farkı o indeximizde bir analiz yapısı olup içerisindede filtreleri barındıracaktır. Faydalı olması dileğiyle...
Bu yazımızda inşaallah elasticsearch'te index oluşturacağız.
PUT yeniindex
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"kisiler": {
"properties": {
"kisi_ad": {
"type": "text"
},
"kisi_soyad": {
"type": "text"
},
"kisi_tc_no": {
"type": "long"
},
"kisi_resim_URL": {
"type": "keyword"
}
}
},
"kitaplar": {
"properties": {
"kitap_ismi": {
"type": "text"
},
"kitap_ISBN": {
"type": "keyword"
}
}
}
}
}
Arkadaşlar burada ilk önce "settings" kısmı ile yeni indeximizin ayarlamalarını yapıyoruz. Daha sonra ise "mappings" ile dökümanlarımızın nasıl tutulacağını belirtiyoruz. Burada dikkat etmemiz gereken önemli noktaları sıralayayım. İlk önce verimizin hangi bölümleri için analiz yapılıp yapılmayacağını belirliyoruz. Ben burada kisi_ad, kisi_soyad ve kitap_ismi için analiz yapılmasını istiyorum. Analiz yapılmasını istediğim alanlar için type tanımlaması olarak text kullanıyoruz. Eğer analiz yapılmasını istemiyorsak keyword tipini seçebiliriz. Zaten sayısal veri türü için bir analiz yapılması söz konusu değil. İlerde yeni bir index tanımlaması yapacağız. Bundan farkı o indeximizde bir analiz yapısı olup içerisindede filtreleri barındıracaktır. Faydalı olması dileğiyle...
25 Temmuz 2018 Çarşamba
Elasticsearch Sorgular
Merhabalar,
Bu yazımda sizlere elasticsearch'te sorgulardan bildiğim kadarıyla anlatmaya çalışacağım.
Elasticsearch' te sorgular iki tiptir. İlki full-text sorgular diğeri ise term sorgularıdır. Ne demek bu derseniz, full-text sorgular için şunu söyleyebilirim; elasticsearch'e kayıtlar girilirken bir analizden geçer. Kayıt tipi text olduğunda bizler için elasticsearch bir analyze yapar. Bu analyze ise iki tiptir. İlki standart analyzer'dir ki kendisi sadece lowercase analyzer'ini kullanır. Diğeri ise bizim isteğimize göre analyze eden bir custom analyzer'dir. Bu analyzer'de ise istediğimiz şekilde metnimizi analyze edip field'lara aktarır. İşte biz bu analyze edilmiş metinler üzerinde yapacağımız ve daha fayda sağlayan sorgularımız full-text sorgularıdır. Bu sorgular, Match Query, Match Phrase Query, Match Phrase Prefix Query Multi Match Query, Common Terms Query, Query String Query ve Simple Query String Query'dir.
Match Query; bu sorgu aradığımız cümleyi kelime kelime eşleştirmeye çalışır. Ve buna göre ilişkilere göre skorlama yapar yani puan verir ve bize sonucu döndürür. Cümle içindeki kelimeleri varsayılan olarak "or" bağlacına göre yapar. Ama biz "operator" : "and" özelliğini eklersek artık "and" bağlacına göre sorgu yapacak. Örneğin; "Ahmet ÖZGÜN" diye sorgu yaptırdık. Biz eğer "or" la kullanmışsak, yani varsayılan değeri kullanmışsak "Ahmet" ya da "ÖZGÜN" ya da "Ahmet ÖZGÜN" leri getirecek. Yani şunu demiş oluyoruz: Bize en az Ahmet veya ÖZGÜN geçen text'leri bu ve getir. Bakın en az diyorum. Ama "and" kullanırsak bize sadece "Ahmet ÖZGÜN" geçenleri getir demiş oluyoruz.
Match Phrase Query; bu sorgu aradığımız cümleyi konumlarıda tutacak şekilde arama yapar. Misal olarak biz "kurt nerede" ifadesini arıyoruz. "kurt istanbul'da nerede" ifadesiyle eşleşme yapmaz. Ama yukardaki Match Query için aynı şeyi söyleyemeyiz. Match sorgusu "kurt istanbul'da nerede" ifadesini bulur. Çünkü Match sorgusu kelime kelime bakarak arama yapar. Ama Match Phrase sorgusu ise konumlarıda tutacak şekilde text içerisinde arama yapar.
Match Phrase Prefix Query; bu sorgu yukardaki Match Phrase ile aynıdır. Farkı sadece son terim için bir harf yada başlangıç harfi-kelimesi giriyoruz. Bundan sonra son girdiğimiz harf-kelimenin tamamlayıcılarını birlikte bularak getiriyor. Diyelim ki "Mehmet A" aratıyoruz. Bulunan sonuçlarda "Mehmet Ali" de çıkar, "Mehmet Aydın" da çıkar. Çünkü son harf olarak "A" yı koymuştuk.
Multi Match Query; Bu query adı üstünde birden çok alanda match sorgusu yapan bir full-text sorgusudur. minimum_shoul_match özelliğiyle en az kaç alanda aradığımız text'i bulmamız gerekiyorsa onu sayı ile belirtebiliriz. Ayrıca match sorgularının her bir alanda nasıl davranmasını istersek yine "operator" özelliğiyle "and" ya da "or" ile belirleyebiliyoruz.
Bu yazımı müsait olduğum zamanlarda tamamlamaya çalışacağım.
Bu yazımda sizlere elasticsearch'te sorgulardan bildiğim kadarıyla anlatmaya çalışacağım.
Elasticsearch' te sorgular iki tiptir. İlki full-text sorgular diğeri ise term sorgularıdır. Ne demek bu derseniz, full-text sorgular için şunu söyleyebilirim; elasticsearch'e kayıtlar girilirken bir analizden geçer. Kayıt tipi text olduğunda bizler için elasticsearch bir analyze yapar. Bu analyze ise iki tiptir. İlki standart analyzer'dir ki kendisi sadece lowercase analyzer'ini kullanır. Diğeri ise bizim isteğimize göre analyze eden bir custom analyzer'dir. Bu analyzer'de ise istediğimiz şekilde metnimizi analyze edip field'lara aktarır. İşte biz bu analyze edilmiş metinler üzerinde yapacağımız ve daha fayda sağlayan sorgularımız full-text sorgularıdır. Bu sorgular, Match Query, Match Phrase Query, Match Phrase Prefix Query Multi Match Query, Common Terms Query, Query String Query ve Simple Query String Query'dir.
Match Query; bu sorgu aradığımız cümleyi kelime kelime eşleştirmeye çalışır. Ve buna göre ilişkilere göre skorlama yapar yani puan verir ve bize sonucu döndürür. Cümle içindeki kelimeleri varsayılan olarak "or" bağlacına göre yapar. Ama biz "operator" : "and" özelliğini eklersek artık "and" bağlacına göre sorgu yapacak. Örneğin; "Ahmet ÖZGÜN" diye sorgu yaptırdık. Biz eğer "or" la kullanmışsak, yani varsayılan değeri kullanmışsak "Ahmet" ya da "ÖZGÜN" ya da "Ahmet ÖZGÜN" leri getirecek. Yani şunu demiş oluyoruz: Bize en az Ahmet veya ÖZGÜN geçen text'leri bu ve getir. Bakın en az diyorum. Ama "and" kullanırsak bize sadece "Ahmet ÖZGÜN" geçenleri getir demiş oluyoruz.
Match Phrase Query; bu sorgu aradığımız cümleyi konumlarıda tutacak şekilde arama yapar. Misal olarak biz "kurt nerede" ifadesini arıyoruz. "kurt istanbul'da nerede" ifadesiyle eşleşme yapmaz. Ama yukardaki Match Query için aynı şeyi söyleyemeyiz. Match sorgusu "kurt istanbul'da nerede" ifadesini bulur. Çünkü Match sorgusu kelime kelime bakarak arama yapar. Ama Match Phrase sorgusu ise konumlarıda tutacak şekilde text içerisinde arama yapar.
Match Phrase Prefix Query; bu sorgu yukardaki Match Phrase ile aynıdır. Farkı sadece son terim için bir harf yada başlangıç harfi-kelimesi giriyoruz. Bundan sonra son girdiğimiz harf-kelimenin tamamlayıcılarını birlikte bularak getiriyor. Diyelim ki "Mehmet A" aratıyoruz. Bulunan sonuçlarda "Mehmet Ali" de çıkar, "Mehmet Aydın" da çıkar. Çünkü son harf olarak "A" yı koymuştuk.
Multi Match Query; Bu query adı üstünde birden çok alanda match sorgusu yapan bir full-text sorgusudur. minimum_shoul_match özelliğiyle en az kaç alanda aradığımız text'i bulmamız gerekiyorsa onu sayı ile belirtebiliriz. Ayrıca match sorgularının her bir alanda nasıl davranmasını istersek yine "operator" özelliğiyle "and" ya da "or" ile belirleyebiliyoruz.
Bu yazımı müsait olduğum zamanlarda tamamlamaya çalışacağım.
17 Temmuz 2018 Salı
Elasticsearch Giriş
Elasticsearch'e Giriş
Herkese merhabalar
Bu yaz stajında öğrendiğim elasticsearch konularını sizlerle paylaşmak istedim. Onun için bu yazı serisini başlattım. Herkese faydalı olması dileğiyle...
İlk önce Elasticsearch nedir ondan bahsetmek istiyorum.
Elasticsearch sitelerde, veri analizinde, veri modellemede kullanılan RestFul api ile haberleşen lucene tabanlı real-time bir arama motorudur. En önemli özelliklerinden bir tanesi çok hızlı istediğimiz sonuçları döndürüyor olmasıdır. Ayrıca veriler üzerinde analiz ve full text search yapabilmemizi sağlar. Çok geniş bir alanda kullanımı vardır.
Elasticsearch kavramları:
Node : Bir server'a kurduğumuz ve tek bir elasticsearch çalıştırdığımız elasticsearch instancesidir. Sorgularımızı (query), index'lerimizi, analizlerimizi bunlar üzerinden yaparız. Özel olarak isim vermezsek random bir isim atanır.
Cluster : Temel olarak cluster bir ağda ve birkaç sunucuda çalışabilen ve node'lerden oluşan bir node kümesidir.
Index : Relational Database'deki database'e benzetebiliriz. İsimleri küçük (lowercase) olmak zorundadır. Bir noda birden fazla index ekleyebiliriz. Bir index birden fazla node'a shard'lar vasıtasıyla yayılabilirler. Böylece performans artar.
Type : Index içerisinde tanımladığımız documentlerden oluşan bir yapıdır. Relational Database'deki table'lere benzetebiliriz. İsimlendirme kuralı ise lowercase olmak zorundadır.
Mapping : Yukarıda bahsi geçen type'lerin nasıl alanlara (field) sahip olacağını belirlediğimiz ve bu alanların hangi analyzer'ler ile kullanılması gerektiğini bildiren bir yapıdır. Relational Database'deki column type, relation'a benzetebiliriz.
Document : Bildiğimiz JSON nesneleridir. Relational Database'deki karşılıkları record'dur. CRUD işlemlerini bu yapılara uygularız.
Shard : Index'lerin daha küçük birimleridir. Her biri bir lucene instancesidir.
Replica : Shard'ların tek bir node'da değilde birden fazla node'a dağıtılarak her bir shard üstündeki yoğunluğu atıp daha performanslı bir yapı ortaya koymak için geliştirilmiştir. Ayrıca replica'sı olan her bir shard'ın yapısında bir bozulma olduğunda çalışmasına devam edebilmesini sağlar.
Bu yazımı daha da geliştireceğim inşaallah. Eksik kısımları yorum kısımlarında bana bildirirseniz çok sevinirim. Herkese bol okumalar...
Herkese merhabalar
Bu yaz stajında öğrendiğim elasticsearch konularını sizlerle paylaşmak istedim. Onun için bu yazı serisini başlattım. Herkese faydalı olması dileğiyle...
İlk önce Elasticsearch nedir ondan bahsetmek istiyorum.
Elasticsearch sitelerde, veri analizinde, veri modellemede kullanılan RestFul api ile haberleşen lucene tabanlı real-time bir arama motorudur. En önemli özelliklerinden bir tanesi çok hızlı istediğimiz sonuçları döndürüyor olmasıdır. Ayrıca veriler üzerinde analiz ve full text search yapabilmemizi sağlar. Çok geniş bir alanda kullanımı vardır.
Elasticsearch kavramları:
Node : Bir server'a kurduğumuz ve tek bir elasticsearch çalıştırdığımız elasticsearch instancesidir. Sorgularımızı (query), index'lerimizi, analizlerimizi bunlar üzerinden yaparız. Özel olarak isim vermezsek random bir isim atanır.
Cluster : Temel olarak cluster bir ağda ve birkaç sunucuda çalışabilen ve node'lerden oluşan bir node kümesidir.
Index : Relational Database'deki database'e benzetebiliriz. İsimleri küçük (lowercase) olmak zorundadır. Bir noda birden fazla index ekleyebiliriz. Bir index birden fazla node'a shard'lar vasıtasıyla yayılabilirler. Böylece performans artar.
Type : Index içerisinde tanımladığımız documentlerden oluşan bir yapıdır. Relational Database'deki table'lere benzetebiliriz. İsimlendirme kuralı ise lowercase olmak zorundadır.
Mapping : Yukarıda bahsi geçen type'lerin nasıl alanlara (field) sahip olacağını belirlediğimiz ve bu alanların hangi analyzer'ler ile kullanılması gerektiğini bildiren bir yapıdır. Relational Database'deki column type, relation'a benzetebiliriz.
Document : Bildiğimiz JSON nesneleridir. Relational Database'deki karşılıkları record'dur. CRUD işlemlerini bu yapılara uygularız.
Shard : Index'lerin daha küçük birimleridir. Her biri bir lucene instancesidir.
Replica : Shard'ların tek bir node'da değilde birden fazla node'a dağıtılarak her bir shard üstündeki yoğunluğu atıp daha performanslı bir yapı ortaya koymak için geliştirilmiştir. Ayrıca replica'sı olan her bir shard'ın yapısında bir bozulma olduğunda çalışmasına devam edebilmesini sağlar.
Bu yazımı daha da geliştireceğim inşaallah. Eksik kısımları yorum kısımlarında bana bildirirseniz çok sevinirim. Herkese bol okumalar...
Kaydol:
Kayıtlar (Atom)
Elasticsearch'te alias Olayı
Merhabalar, Bu yazımda sizlere elasticsearch'teki alias olayını aktaracağım. Diyelim ki biz yeni bir index oluşturduk. Bu index'imi...
-
Evet bu yazımda sizlere sayı basamakları hakkında bahsedeceğim. Aslında bu konu pek hafızamda yoktu. Fakat başka bir yazı yazarken b...
-
Merhabalar, Bu yazımda sizlere elasticsearch'te sorgulardan bildiğim kadarıyla anlatmaya çalışacağım. Elasticsearch' te sorgular ...