15 Ağustos 2018 Çarşamba

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

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.

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.

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.

GET db/members/_search/template
{
  "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.
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.
mouse, fare
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.
mouse => fare
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.
{
  "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.
{
  "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.
{
  "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.
{
  "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"
      }
    }
  }

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

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