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