Elastic Search’e Giriş
Search artık hayatımızda her yerde. Eğer ideal bir search engine arıyorsanız, searchin tüm yan özellikleriyle de ilgilenmeniz gerekecektir. Relevant sonuçları dönme, search prediction, istatistikler çıkarma ve bunların her birini hızlı yapma. Elasticsearch tam da bu noktada devreye giriyor. Örneğin, search engineniniz akıllı olmalı, siz bir search yapmak istediğinizde tüm kelimeyi yazmak zorunda olmadan suggestionlar ile bunu tamamlayabilmeli. Aradığınız konuya en ilişkili sonuçları titizlikle dönebilmeli. Bu sadece kelime eşleşmesiyle kalmayıp bunun çok ilerisine gidebilmeli. Çünkü genelde insanlar aramak istediklerini sadece ilk ya da ilk iki sayfada arayıp daha da ötesine gitmiyorlar ve umudu kesiyorlar :). Size datalardan belli istatistikler çıkarabilme imkanı vermeli ve tabi ki de olabildiğince hızlı olmalı. Kimse search yapmak için dakikalarca beklemek istemez. İşte elasticsearch tam da bu nokta da ve hatta daha fazlasında sahneye geliyor.
KULLANICI GÖZÜNDEN NEDEN ELASTICSEARCH?
Elasticsearch apache lucene üzerinde geliştirilmiş open-source ve distributed bir search enginedir. Şimdi elastic searchün yukarıda saydığımız search engine konularına nasıl çözümlerle yaklaştığını ve bu yaklaşımlar ile elastic searchü nerelerde kullanabileceğimize bakalım.
1. Hızlı Sonuç Getirme
Eğer ki büyük bir veri yığını arasından search işlemi yapıyor iseniz bir search engineden ilk beklentiniz, hızlı search yapabilmesi olacaktır. Elasticsearch ile çok büyük veri setlerinde çok hızlı, performanslı bir şekilde search yapabilirsiniz. Veri setleri arasından hızlı arama yapmayı sağlayan yapı hepimizin bildiği gibi indexingtir. Her database için indexleme yapabilirsiniz. Ancak Lucene, inverted index olarak adlandırılan sizin datanızı yüksek performansla aratabilecek bir bir index yapısına sahip. Temel mantık, her bir kelimenizi ayrıştırıp bu kelimelerin hangi documanlarda bulunduğunun tutulması. Örneğin
- Ali akşam eve geldi.
- Akşam hava çok güzeldi
- Senin evde ne işin var?
Ali –> 1
Akşam –> 1, 2
Ev –> 1, 3
…
Yukarıdaki gibi 3 adet dökümanımızın olduğunu varsayarsak indexleme işlemi bir aşağıdaki gibi kelimelerin hangi dökümanlarda bulunduğunu tutacaktır. Siz “akşam” kelimesini arattığınız zaman size direkt olarak 1 ve 2. döküman, “ev” kelimesini arattığınız zaman 1 ve 3. döküman dönecektir. Bu yapıya inverted (tersinir) denmesinin sebebi, sıradan dblerde siz index üzerinden bir dataya ulaşıyorken, en basitinden select * from Students where ID=5 gibi, inverted indexte data üzerinden indexe ulaşırsınız. Detaylarını anlattığım bir yazım olduğu için inverted indexe ayrıca girmeyeceğim.
Elasticsearchin arkasındaki algoritma : Inverted Index ve TF-IDF
2. Relevant sonuçları Dönebilme
Bir diğer önemli ve zor konu da searchünüzle en ilgili dataları belirleyip onları sonuç olarak döndürebilme. Örneğin, siz “bisiklet” kelimesini arattınız. Size dönmesi gereken sonuçlar bu aramayla ilgili olmalı. En ilgili olanlar da en üst sıralarda dönmeli. Peki bu ilişki nasıl kurulmalı?
Bisiklet kelimesinin en fazla geçtiği text sizin için en ilişkili sonuç olabilir mi? Evet kulağa mantıklı geliyor. O zaman elasticsearch için aramanıza en ilgili sonuç dönmekteki ilk kriter sizin arattığınız textin sonuçlarda kaç kere geçiyor olduğudur. İşte buna da Term Frequency (TF) denir. Ancak bu kriter tek başına sorun çıkarabilir çünkü düşününce devamında bir sürü sıkıntı da geliyor. Örneğin, bisiklet modellerine bakan biri, bu kapsamda bisiklet aksesuarları, bisiklet tamiri vs gibi ilişkili sonuçları da üstlerde görebili ya da öyle kelimeler vardır ki sayısı sizin için sonuçları öncelikli hale getirmez. Örneğin “ve”, “ile” gibi bağlaçlar metinlerde yüzlerce kez geçebilir. Ancak bu eşleşme sizin textinizle sonuçu daha ilişkili yapmaz. Ya da “ölüm korkusu” diye bir arama yaptıgınızı varsayalım. Burada korku kelimesinin bir metinde çok fazla geçmesi, belki o sonuç genel anlamda korkudan ya da başka bir korku türünden bahsediyor da olsa sonuçları daha üste çıkarabilir. Dolayısıyla bu durumun bizi götürdüğü nokta Inverse Document frequency (IDF) kavramı yani kelimelere ağırlıklar vererek değerlerini belirleme.
Yukarıda bahsettiğim korku örneği üzerinden gidelim. “Araknafobi korkusu” şeklinde bir arama yapalım. Burada sonuç içerisinde araknafobinin kelimesinin geçmesiyle korku kelimesinin geçmesi search resultı üzerinde aynı ağırlığa sahip olmamalı ya da aynı şekilde herhangi bir bağlacın “ve”, “veya” gibi, daha fazla geçmesi aynı ağırlığa sahip olmamalı. Inverse document frequencynin temel noktası da kelimelere ağırlık vererek result üzerindeki önemini belirlemektir.
TF ve IDF’i bir arada kullanarak documanlar için relevancy scorelar belirlenir. TF-IDF algoritması aslında elasticsearch özelinde bir algoritma olmayıp text searchte önemli bir yer taşıyan derin bir algoritmadır. Bu algoritmanın detaylarını merak ediyorsanız Elasticsearchin arkasındaki algoritma : Inverted Index ve TF-IDF yazım üzerinden devam edebilirsiniz.
Ayrıca relevancy score hesaplanırken bu algoritmaya ilaveten built in özellikler kullanabilirsiniz. Örneğin, bir metnin titlendaki eşleşme, bodysindeki eşleşmeden daha fazla önem ağırlığına sahiptir ya da direkt aklınıza gelen herhangi bir kriteri script olarak da ekleyebilir ya da metninizin like’lanması gibi bir opsiyon varsa like sayısı daha fazla olan metnin resultlar arasındaki önceliğini arttırabilirsiniz.
3. Akıllı Search Engine
Bir search engine kullanıyorsanız yukarıdaki özelliklerin yanında yazım yanlışı yapılsa dahi doğru sonuçla eşleştirme, searchünüzden türetmeler ve öneriler, istatistiksel sonuçlar çıkarma gibi akıllı ve sezgisel özellikleri olmasını da istersiniz.
3.1 Yazım Yanlışları
Elasticsearch’ü exact eşleşmelerin dışında yazım yanlışlarına toleranslı olacak şekilde de konfigure edebilirsiniz. Fuzzy query olarak geçen bu yapı örneğin “bsiiklet” kelimesini “bisiklet” kelimesi olduğunu anlayıp eşleştirebilir. Bunun örneğini googleda da bunu mu demek istediniz şeklinde görebiliyoruz.
3.2 Eş Anlamlılar
Aynı şekilde, elasticsearch aramazına ilişkili eşanlamlıları da aramanıza dahil edebilir. Örneğin aradığınız cümlede “taşıt” kelimesi geçiyorsa “vasıta” kelimesi geçen sonuçları da size döndürebilir.
3.3 Türetme ve Öneriler
Kullanıcı search için kelime girerken daha o sırada onun populer searchleri görebilmesini sağlayabiliri, suggestionlarla en çok arananlar popular sonuçlar ya da eşanlamlıları da search edebilirsiiz.
3.4 İstatistik
Elinizdeki search verilerinden istatistiksel datalar da çıkarabilirsiniz.
Buraya kadar bahsettiğim kısım kullanıcı gözünden elasticsearchün özellikleri ve neden tercih edilebileceği ile ilgiliydi. Bunların yanında teknik taraftan da baktığımızda elasticsearch’ün distributed bir yapıda olduğunu da söylemiştim. Yani siz verilerinizi yatayda bölümleyerek farkı makinalarda tutabilir(sharding), bu verilerin kopyalarını da yine farklı makinalarda tutabilirsiniz (replika). Elastic searchün dağıtık yapısı performance, fault tolerance bir sistem ve availilblity sağlar
ELASTICSEARCH’Ü NE SEKILDE KULLANABILIRIZ?
Elasticsearch en nihayetinde bir search engine, tek başına kullanmaktan çok bir sisteme entegre etmemiz, datayla beslememiz, kullanıcılara search yapacakları bir interface sunmamız vs. gerekebilir. Peki bu özelliklerle elasticsearchü nerelerde kullanabiliriz?
Elasticsearchle ilgili use caseler çok çeşitli olmakla birlikte toparlarsanız genel olarak 3 ana başlıkta toplanabilirler.
- Biricil database olarak kullanmak.
- Var olan sistem üzerine çalıştırmak.
- Elasticsearch tabanlı hazır ürünler ile kullanmak
Bu use caseleri sırayla detaylandıralım.
1.Elasticsearchü birincil database olarak kullanmak
Elasticsearch size durable bir storage imkanı sunar. Sıfırdan bir projeye başlıyorsanız, elasticsearchi birincil database olarak da kullanabilrsiniz. Bu da size desgininizı da olabildiğince simple tutma imkanı verir. Ancak bu her durumda iyi çalışmaz. Örneğin, çok fazla updateiniz var ise elasticsearchi başka bir db üzerinde çalıştırmayı düşünebilirsiniz. Ayrıca diğer Nosql data storesler gibi, elastic search transcation desteği yoktur. Transcation ihtiyacınıza göre başka bir database kullanmayı da düşünmelisiniz.
2. Var olan sistem üzerinde çalışma
Elasticsearch’ü birincil db olarak kullanmak her zaman case ve fonksiyonelliklerinize tam olarak oturmayabilirz. Örneğin transcation support ve complex relastionship var ise elasticsearch uygun bir seçim olmayabilir ya da zaten çok kompleks bir sisteminiz vardır ve yapıyı bunun üzerine kurmanız gerekir. Bu durumda iki data store’unuz olacaktır. Burada da önemli kısım dataları senkron tutmaktır. Bunu da elasticsearch pluginleri ile ya da kendi web servisleriniz ile sağlayabilirsiniz. Insert ve updateler yine birincil dbye yapılır. Elastic search sadece belli aralıklarla up to date olur.
3. Elasticsearch tabanlı hazır ürünler kullanmak
Bazen tek bir satır kod yazmanıza bile gerek kalmadan elasticsearch tabanlı ürünleri kullanabilirsiniz. ELK