Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Elasticsearch'e Giriş

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Elasticsearch'e Giriş

Avatar for Haydar Külekci

Haydar Külekci

June 25, 2016
Tweet

More Decks by Haydar Külekci

Other Decks in Technology

Transcript

  1. Elasticsearch • Gerçek zamanlı veri sunar. (Neredeyse gerçek zamanlı) •

    Gerçek zamanlı gelişmiş analiz yapabilmenize olanak verir • Kolayca dağıtık yapı kurabileceğiniz bir yapı sunar • Kendi içerisinde yüksek erişilebilirlik sunar • Full-text search yapabilmenizi sağlar • Döküman odaklı çalışır • Geliştirici dostudur ve Restful bir API arayüzü vardır. • Lucene tabanlıdır
  2. Elasticsearch ile Neler Yapabiliriz? • Full-text arama ve filtreleme için

    kullanabiliriz. (Search API) • Günlüklerimizi (Logs) barındırmak ve içerlerinde arama yapmak için kullanabiliriz. (Logstash, Kibana) • Verilerimiz üzerinde neredeyse gerçek zamanlı analiz ve raporlar hazırlamak için kullanabiliriz. (Aggregations)
  3. Cluster • Bir veya daha fazla ‘node’dan oluşan yapılardır. •

    Tüm verinizi bir arada tutmanızı sağlar ve tüm node’larda arama yapabilmenizi sağlar. • Tekil bir isim ile adlandırılır. Cluster için bir isim vermek önemlidir. Aynı ağda farklı cluster’lar oluşturma imkanı sağlar. https://blog.codecentric.de/wp-content/blogs.dir/2/files/2014/03/elasticsearch-bigdesk-cluster-diagram.png
  4. Node • `Cluster`larınızın bir parçası olan sunuculardır. Verinizi barındırırlar. •

    Bir isim ile adlandırılır ve isimlendirme `node`ların tanınması için önemlidir. Eğer siz bir isim vermez iseniz otomatik atanacaktır. • Her `node` özel bir `cluster`a bağlıdır. Varsayılan olarak her bir node `elasticsearch` cluster’ına dahil olur. https://blog.codecentric.de/wp-content/blogs.dir/2/files/2014/03/elasticsearch-bigdesk-cluster-diagram.png
  5. Shard • Örneğin bir index 1TB büyüklüğündeki veri kümesine sahipsiniz

    ve bir `node` için bu büyüklük biraz fazla olabilir. • Bu gibi durumlarda Elasticsearch size index’lerinizde barındırdığınız büyük veri kümelerini `shard` adını verdiğimiz parçalara bölme imkanı sunar. • Aslında, her bir `shard` bir Lucene Instance’dır ve kendi başına tamamen işlevsel bir arama motorudur. • Bir index tek başına bir shard’dan oluşabilir, ama genellikle index in büyüyebilmesi ve bir kaç node üzerinde dağıtılabilmesi için bir kaç shard’dan oluşmaktadır. http://stackoverflow.com/questions/15426441/understanding-segments-in-elasticsearch/15429578#15429578
  6. Replica Shard • `Replica Shard` ana `Primary Shard` bir hata

    verdiğinde ya da okuma işlemleri çok fazla arttığında kullanılmak için oluşturulmuş bir yedektir.
  7. Index • Index ilişkili bir veritabanındaki veritabanları gibidir. Temelde, bir

    index bir veya daha fazla shard’ı temsil eden mantıksal bir alan adıdır. • Benzer özellikteki verilerinizi Index’ler içerisinde saklayabilirsiniz.
  8. Type • Elasticsearch'te type benzer dökümanlar sınıfıdır. • Örneğin users

    adında bir index'iniz var. Bu index içerisinde user diye bir type oluşturabilirsiniz. • Ya da kullanıcı role'lerine göre type'lar oluşturabilirsiniz. admin, user, staff gibi.
  9. Document • Elasticsearch’te tekil bir id ile tutulan JSON objelerine

    “document” döküman denir. • Aramalarımızı dökümanlar üzerinde yaparken, sonuçlarımızı da dökümanlardan gösteririz. { "name": "John Smith", "age": 42, "confirmed": true, "join_date": "2014-06-01", "home": { "lat": 51.5, "lon": 0.1 }, "accounts": [ { "type": "facebook", "id": "johnsmith" }, { "type": "twitter", "id": "johnsmith" } ] }
  10. Mapping • Verilerinizin hangi alanlardan oluştuğunu ve bu alanların tiplerinin,

    özelliklerinin neler olduğunu belirtirler. Hangi alanların `index`e alınacağı ya da alınmayacağını belirler. • Daha önce de bahsettiğimiz gibi Elasticsearch’te her index altında `Type`lar mevcuttur. Her bir type’a ait `mapping`ler vardır. http://lucene.apache.org/core/3_5_0/fileformats.html#Primitive Types
  11. Mapping (Ekstra) • Lucene değerin string, sayı ya da tarih

    formatında olmasını önemsemez. Tüm değerler field-value tutulur ve opaque bytes olarak kabul edilir. • Type’ların Lucene tarafında direk olarak bir karşılığı yoktur. Lucene tarafında bu veriler saklanırken her bir dokümana meta data eklenir. Bu meta veri içerisinde _type diye bir alan vardır. Bu alana verinizin `Type` bilgisi yazılır. Biz özel bir `Type`a göre bir arama yaptığımızda Lucene tarafında _type alanında bir filtreleme yapar. • Lucene'de aynı zamanda mapping diye bir kavramda yoktur. Mapping’ler Elasticsearch'ün karışık JSON dökümanlarını Lucene'in beklediği bir yapıya sokmak için kullandığı bir ara katmandır.
  12. Mapping Örnekleri POST /core/user/_mapping { "properties": { "id": { "type":

    "integer" }, "name": { "type": "string" } } } POST /core/company/_mapping { "properties": { "id": { "type": "integer" }, "name": { "type": "string" }, "description": { "type": "string" } } }
  13. Inverted Index • Verilerinizi aranabilir olması için kullanılan bir veri

    yapısındır. • Yeni bir döküman geldiğinde, döküman üzerindeki her bir alan `inverted index`e eklenir. Orijinal döküman da daha sonra geri verilebilmesi için saklanır. Daha sonra aramalar bu `inverted index` kısmında yapılır. • Bunu bir örnek ile gösterelim : Kaynak : https://lucene.apache.org/core/3_0_3/fileformats.html#Inverted Indexing Metin : http://www.emo.org.tr/ekler/7c6326a2cfccd2f_ek.pdf
  14. • Verilerinizi aranabilir olması için bir veri yapısındır. Inverted Index

    https://lucene.apache.org/core/3_0_3/fileformats.html#Inverted Indexing
  15. • Verilerinizi aranabilir olması için bir veri yapısındır. Inverted Index

    https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenfilters.html
  16. Döküman Arayüzü (Document API) • Elasticsearch’te CRUD işlemlerini yapabildiğiniz API

    arayüzüdür. • Tekil bir döküman için Index, Get, Delete, Update API arayüzleri bulunmaktadır. • Aynı zamanda MultiGet ve Bulk API arayüzü ile aynı anda birden fazla döküman üzerinde işlem yapabilirsiniz. • 2.3 versiyonu ile birlikte UpdateByQuery API arayüzü ile arama yaparak dökümanları güncelleyebilirsiniz. • 2.3 versiyonu ile birlikte ReIndex API arayüzünü kullanarak dökümanlarınızı farklı indexlere hızlıca taşıyabilirsiniz.
  17. Get, Index, Delete Arayüzleri ### INDEX API PUT /users/staff/1 {

    "id": 2, "name": "Haydar", "viewCount": 1 } ### GET API GET /users/staff/1 ### DELETE API DELETE /users/staff/1
  18. Update Arayüzü • Elasticsearch’te CRUD işlemlerini yapabildiğiniz API arayüzüdür. •

    Tekil bir döküman için Index, Get, Delete, Update API arayüzleri bulunmaktadır. • Aynı zamanda MultiGet ve Bulk API arayüzü ile aynı anda birden fazla döküman üzerinde işlem yapabilirsiniz. ### SCRIPTED UPDATE POST /users/staff/1/_update { "script" : { "inline": "ctx._source.viewCount += viewCount", "params" : { "viewCount" : 1 } } } ### PARTIAL UPDATE POST /users/staff/1/_update { "doc" : { "name" : "Mustafa" } } https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html#enable-dynamic-scripting
  19. • Önceki versiyonlarda bir eklenti ile kullanabilirsiniz. Update By Query

    (Sadece 2.3’de) ### UPDATE BY QUERY POST /users/staff/_update_by_query { "script": { "inline": "ctx._source.viewCount += 1" }, "query": { "term": { "name": "mustafa" } } } https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html
  20. ReIndex Arayüzü (Sadece 2.3’de) • Önceki versiyonlarda bir eklenti ile

    kullanabilirsiniz. ### REINDEX API POST _reindex { "source": { "index": "users" }, "dest": { "index": "users2016" }, "script": { "inline": "ctx._source.count = ctx._source.remove(\"viewCount \")" } } https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html
  21. Index Oluşturma ve Silme POST /users { "settings" : {

    "index" : { "number_of_shards" : 3, "number_of_replicas" : 2 } } } POST /users DELETE /users
  22. Index Bilgilerini Almak GET /users ### RESPONSE { "users": {

    "aliases": {}, "mappings": { "staff": { "properties": {……} } }, "settings": { "index": { "creation_date": "1466767736260", "number_of_shards": "5", "number_of_replicas": "1", "uuid": "WULhd-A3T3CUAH8-jdIgtA", "version": { "created": "2030399" } } }, … } }
  23. • Cluster için bir yük oluşturmaz. • Sadece okuma/yazma işlemlerini

    engellenmiş olur. Index’i Açıp Kapatmak ### CLOSE INDEX POST users/_close ### OPEN INDEX POST users/_open
  24. Index için Mapping Oluşturmak PUT users { "mappings": { "staff":

    { "properties": { "id": { "type": "long" }, "name": { "type": "string" }, "viewCount": { "type": "long" } } } } }
  25. Type için Mapping Oluşturmak PUT users/user/_mapping { "properties": { "id":

    { "type": "long" }, "name": { "type": "string" }, "viewCount": { "type": "long" } } }
  26. Alias (Takma Isim) Arayüzü • Takma isimler vererek verilerini daha

    kolay erişebilir hale getirebilirsiniz. POST /_aliases { "actions": [ { "add": { "index": "users", "alias": "users_20160420", "filter": { "range": { "viewCount": { "gte": 100 } } } } } ] }
  27. Arama Arayüzü • Arama sorgularınızı çalıştırmanızı sağlayan API arayüzüdür. •

    _search url parametresi ile kullanılır. ### URL SEARCH GET /listings/_search?q=title:istanbul GET /listings,projects/_search?q=title:istanbul ### REQUEST BODY SEARCH GET /listings,projects/_search { "query" : { "term" : { "title" : "istanbul" } } }
  28. Filter & Query • Filter => Bu döküman bu arama

    parametreleri ile eşleşiyor mu? • Score yok • Sadece evet/hayır sorusunu cevaplar • Belleklenebilir (Caching active) • Query => Bu döküman bu arama parametreleri ile en iyi nasıl eşleşir? • Bir score hesaplanır ve diğer dökümanlar ile bağlantılıdır
  29. Full-Text Sorgular GET github_with_mapping/action/_search { "query": { "match": { "actor.login.autocomplete":

    "lom" } }, "_source": ["actor.login"] } https://www.elastic.co/guide/en/elasticsearch/guide/2.x/_index_time_search_as_you_type.html
  30. Terim Seviyesinde Sorgular • `term` sorgusu • `terms` sorgusu •

    `range` sorgusu • `exists` sorgusu • `missing` sorgusu • `prefix` sorgusu • `wildcard` sorgusu • `fuzzy` sorgusu • `ids` sorgusu
  31. Bileşik Sorgular • `bool` sorgusu • `constant_score` sorgusu • `function_score`

    sorgusu • `filtered` sorgusu (deprecated on 2.0.0) • `and`, `or` ve `not` sorguları • `boosting` sorgusu
  32. Profile Arayüzü (2.x ile birlikte) • Sorgularınızı profile edebilir ve

    nasıl çalıştıklarını görebilirsiniz. GET /listings/_search { “profile”: true, "query" : { "term" : { "title" : "istanbul" } }, "aggs": { "type": { "terms": { "field": "type.label" } } } }
  33. Profile Arayüzü (2.x ile birlikte) { "took": 25, "timed_out": false,

    “hits": [ ... ], "profile": { "shards": [ { "id": "[htuC6YnSSSmKFq5UBt0YMA][listings][0]", "searches": [ { "query": [...], *1 "rewrite_time": 185002, *2 "collector": [...] *3 } ] } ] } }
  34. Profile Arayüzü (2.x ile birlikte) 1. Sorgunuzdaki query’leriniz için daha

    detaylı bilgi vermektedir. 2. Her bir profil için toplu zamanı gösterir 3. Lucene tarafında kullanılan Collectors’ları gösterir. https://www.elastic.co/guide/en/elasticsearch/reference/2.3/search-profile.html
  35. Aggregations • Arama sonuçlarınızdan toplu bir veri elde etmenizi sağlar

    • Bucket Aggregation • Verileriniz sadece birleştirir ve bunlar üzerinden bilgi sunar. (Missing, Filter, Children, Terms, Date Histogram, Date Range, …) • Metrics Aggregation • Verileriniz üzerinde hesaplama yapar ve sonuçlarını sunar. (Avg, Cardinality, Extended Stats, Stats, Sum, Top Hits, …) • Pipeline Aggregation • Başka bir aggregation sonucundaki veriler üzerinde işlem yapar ya da verileri toplar. (Avg Bucket, Derivative, …)
  36. Terms Aggregations • Arama sonuçlarınızdan toplu bir veri elde etmenizi

    sağlar • Bucket Aggregation • Verileriniz sadece birleştirir ve bunlar üzerinden bilgi sunar. (Missing, Filter, Children, Terms, Date Histogram, Date Range, …) • Metrics Aggregation • Verileriniz üzerinde hesaplama yapar ve sonuçlarını sunar. (Avg, Cardinality, Extended Stats, Stats, Sum, Top Hits, …) • Pipeline Aggregation • Başka bir aggregation sonucundaki veriler üzerinde işlem yapar ya da verileri toplar. (Avg Bucket, Derivative, …) GET /listings/_search { "query" : { "term" : { "title" : "istanbul" } }, "aggs": { "type": { "terms": { "field": "type.label" } } } }
  37. Terms Aggregations • Arama sonuçlarınızdan toplu bir veri elde etmenizi

    sağlar • Bucket Aggregation • Verileriniz sadece birleştirir ve bunlar üzerinden bilgi sunar. (Missing, Filter, Children, Terms, Date Histogram, Date Range, …) • Metrics Aggregation • Verileriniz üzerinde hesaplama yapar ve sonuçlarını sunar. (Avg, Cardinality, Extended Stats, Stats, Sum, Top Hits, …) • Pipeline Aggregation • Başka bir aggregation sonucundaki veriler üzerinde işlem yapar ya da verileri toplar. (Avg Bucket, Derivative, …) { ... "hits": { "total": 1647, "max_score": 3.833746, "hits": [...] }, "aggregations": { "type": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "Sale", "doc_count": 1216 }, { "key": "Rent", "doc_count": 431 } ]
  38. Teşekkürler • Blog : http://elasticsearch.kulekci.net • Twitter : http://twitter.com/kulekci •

    Github : http://github.com/hkulekci • Geri Bildirim Formu : http://bit.ly/esfeedback