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


Hiç yorum yok:

Yorum Gönder

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