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.

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…
İlk önce basit bir Match Query’si yapalım.
{
      “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
                      }
                 }
           }
}
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”
                      }
                 }
           }
}
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
                      }
                 }
           }
}
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.

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

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.





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

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