1. Analyzer Nedir?
Elasticsearch’e yolladığınız dökümanlar maksimum performans ve amaca hizmet edebilen bir search yapısı oluşturuabilmek için, indexlenmeden önce bir dizi işlemden geçer. Bu işlemlerin bütünü Analysis, işlemi yapan kısım ise Analyzer olarak adlandırılır. Elasticsearch analyze işlemi için döküman bir dizi farklı işlemden geçer. Bunlar
1. Karakter filtreleme
2. Texti tokenlara ayrıştırma
3. Token filtreleme
4. Token indexleme
Bir bir bu işlemlerin detaylarına girelim.
1.1. Karakter Filtreleme
Bu işlem daha doğru search sonuçları elde edebilmek için belirli karakterleri farklı karakter dizilerine çevirme işlemidir.
Örnek : I love u 2 –> I love you too ya da you & me –> you and me
1.2.Texti Tokenlara Ayrıştırma
Text’e karakter filtresi uygulandıktan sonra, ilgili dökümanın kelime setlerine ayrıştırılması gerekir. Lucene, inverted index yapısı gereğince dökümanlara, olduğu gibi search yapmak yerine onları token adı verilen kelimelere ayrıştırarak işlem yapar. Örneğin standart tokenizer kullanırsanız cümleyi whitespacelere yani boşluklara ve newlinelara göre tokenlara ayrıştırırsınız.
Örnek : “share your experience with Nosql and big data technologies”
Tokens : “share”, “your”, “experience”, “with”, “nosql”, “and,” “big”, “data”, “technologies”
1.3. Token Filtreleme
Token filtreleme işlemi ise tokenları alarak onları ihtiyaca göre modifiye edilmesi işlemidir.
Örnek : Lowercase token filte kullanırsanız tüm tokenlarınız küçük harfe çevrilir.
Token birden fazla token filter üzerinden geçebilir.
1.4. Token İndexleme
Tokenlar, token filterlar üzerinden geçtikten sonra lucene’a indexlenmek üzere gönderilir ve inverted index’e yerleştirilir. Hiç ya da birden fazla karakter filtreleme, tokenizer ve hiç ya da birden fazla token filtreleme işlemi bir araya gelerek Analyzer denen yapıyı oluşturur.
2.Dökümanlarda Analyzer Kullanma
Analyzer tanımlamanın 2 farklı yolu vardır.
- Index yaratıldığında, index’e özel bir setting olarak eklenebilir.
- Elasticsearch configurasyonuna global analizer olarak eklenebilir.
İndex özelinde analyzer yaratmak size index bazlı daha esnek bir yapı sunar. Ancak elinizde tüm indexleriniz için kullanacağınız ve çok sık değiştirmeyeceğiniz bir analyzer setiniz varsa bunu configuration file’a koyup bandwidthten kazanabilirisiniz. İndex bazlı analyzer, üzerinde yapılan değişiklikler için restart’a ihtiyaç duymazken elasticsearch global analyzerlarında yapılan değişiklik elasticsearchte restart gerektirir.
Bazı durumlarda ihtiyaçlarınıza göre hem analized verison textte hem de normal textte serach yapma ihityaayınız olur. Bunu multi-field type ile yapabilirsiniz
3. Built In Analyzer Componentleri
3.1. Built In Analyzer’lar
Standart Analyzer : Hiç bir analyzer tanımlanmadığı durumlarda geçerli standart default analyzerdır. Standart lowercase token filterini ve stok token filterini içerir.
Simple Analyzer : Adından da anlaşılacağı üzere basit bir yapısı vardır. Lowercase tokenizerı içerir. Tokenlar nonletters olarak bölünür ve otomatik olarak lowercase hale çevrilir. Kelimeleri boşlukla ayrıştırmayan Asya dilleri için uygun bir analyzer değildir.
Whitespace Analyzer : Textleri whitespacelere göre tokenlara ayrıştırmaktan başka hiç bir şey yapmaz 🙂
Stop Analyzer : Temelde simple analyzer gilbi davranır bir de ek olarak stop wordleri token streaminden filtreler.
Keyword Analyzer : Tüm fieldı alıp tek bir token üretir.
Pattern Analyzer : Tokenlar için bölünecek specific bir pattern belirlemenizi sağlar.
Snowball Analyzer : Standart tokenizer ve token filtresini lowercase token filter ve stop filter ile kullanır.
Language and Multilangual Analyzer :
3.2 Built In Tokenizer’lar
Yazının başında da söylediğimiz gibi, tokenization texti alıp onu ufak parçalara bölme işlemidir.
Standart tokenizer : Grammar-based tokenizerdır. Avrupa dilleri için idealdır. Ayrıca noktalama işaretlerini de siler.
Örnek : “I have, potatoes.” — > “I”, “have”, “potatoes”
Keyword tokenizer : Tüm texti alıp token filtera tek bir token sağlayan tokenizerdır. Texti alıp hiç bir tokenizationdan geçirmeden token filter uygulamak istediğiniz durumlarda kullanışlıdır.
Örnek : “hi, there” –> “hi”, “and”, “there”
Letter tokenizer : Letter tokenizer texti alır ve onu harf olmayan şeylere göre split eder.
Örnek : “Hi, there.” Hi” ve “there” olur çünkü virgül, boşluk ve nokta harf değildir
Lowercase tokenizer : Lowercase tokenizer letter tokenizer ile lowercase token filteri kombine eder. Ana amacı iki farklı tokenizer yerine tek tokenizer kullanarak performans kazanmaktır.
Whitespace tokenizer : The whitespace tokenizer tokenları whitespaceleri baz alarak ayırır. Bu whitespaceler, tab, line break vs olabilir. Bu tokenizer için önemli nokta hiç bir noktalama işaretini silmiyor oluşudur.
Pattern tokenizer : Pattern tokenizer size tokenlarınızı ayrıştıracağınız patternler tanımlama imkanı sunar.
3.3. Built In Token filter’lar
Standart : Hiç birşey yapmaz 🙂
Lowercase : Üzerinden geçen tokenları lowercase yani küçük harfe çevirir.
Length : Verilen min ve max değer sınırını aşan tokenları siler.
Stop : Stop kelimelerini tokenlar arasından siler. Bu stop kelimeleri ingilizce dili için a, an, and, are, as, at, be, but, by, for, if, in, into, is, it, no, not, of, on, or, such, that, the, their, then, there, these, they, this, to, was, will, with kelimelerdir.
Trim : Varsa tokenlardaki boşlukları siler.
4. Ngrams ve Edge n gram
4.1. Ngram
Ngram ve edge ngram Elasticsearchte bir texti tokenize etmenin iki özel yoludur. Ngram tokeni eşit parçalar şekilde subtokenlara ayıran yöntemdir. Hem Ngramda hem de Edge ngramda tokenın min ve max sizeını belirleyebilrmek için min_gram ve max_gram olmak üzere iki setting ayarlarız. Konunun daha net anlaşılması için bir örnek üzerinden giderek “spaghetti” kelimesini Ngram ile tokenlarına ayrıştıralım.
1-grams : s, p, a, g, h, e, t, t, i
Bigrams : sp, pa, ag, gh, he, et ,tt ,ti
Trigrams : spa, pag, agh, ghe, het, ett, tti
Min_gram ve Max_gram üzerinden ilerleme : Bu iki setting, yukarıda da bahsettiğim gibi yaratmak istediğiniz en küçük ve en büyük tokenlar üzerinden işlem yapar. Örnek üzerinden ilerleyip min_gramı 2 max gramı da 3 olarak ayarlayalım.
sp, spa, pa, pag, ag, agh, gh, ghe, he, het, et, ett, tt, tti, ti
Bu şekilde text analizi ilginç bir avantaj getiriyor. Örneğin, spagetti yerine spaghety arattığınızı varsayalım. Bu aramanın bir yolu fuzzy query ancak benzer faydayı Ngramlar ile de sağlayabilirsiniz.
Bigrams for “spaghetti” : sp, pa, ag, gh, he, et, tt, ti
Bigrams for “spaghety” : sp, pa, ag, gh, he, et, ty
Görüldüğü üzere 6 token eşleşmekte. Dolayısıyla spaghetti halen spaghety ile eşleşecek durumda. İkinci bir faydası da dilini bilmediğiniz textler ya da içerisinde avrupa dillerinden farklı diller barındıran tekxler için. Birden fazla dili birden fazla analyzer tanımlayarak işlemenin de önüne geçebilir.
4.2. Edge Ngrams
Edge ngramlar ise Ngramları sadece front edge’den inşa eden yapıdır. Yine bir örnek üzerinden, Spaghetti örneği için min_gram 2 max_gramı da 6 set edersek tokenlarımız sp, spa, spag, spagh, spaghe olacaktır. Bu da aynı prefixi paylaşan kelimeleri prefix query çalıştırmadan search etme imkanı sağlar.
Ngramlar, kelimeler arasında boşluk olmayan dilleri analiz edebildikleri için, hangi dile sahip olduğunuzu bilmediğinizde metni analiz etmenin güzel bir yoludur.
Shingles : Shingles token filter aslında karakter yerine token seviyesnde bir ngramdır.
“foo bar baz”
mn-in_shingle_size 2 max_shingle_size 3
foo, foo bar, foo bar baz, bar, bar baz, baz
Ancak hala set içerisinde single token outpun olduğunu dagörüyorsunuz. Bunu output_unigrams ‘ı false’a set ederek önleyebilirsiniz.
4.3. Stemming
Stemming kelimeyi base’ine ya da rootına indirme işlemindir. Oldukça kullanışlıdır çünkü bazı durumlarda kelimenin kendisi yerine çoğul hali üzerinden ya da aynı kökü paylaşan kelimeler üzerinden de arama yapmak isteyebilirsiniz.
Örneğin administrations. Kelimenin kökü administr. Stemming ile diğer kök yapılarla da eşleşme sağlayabilirsiniz. “admintistrator,” “administration,” ve“administrate.” Stemming katı exact matchler yerine esnek matchler sağlamanın güzel bir yoludur.