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.
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 ...