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

Elasticsearch'e Giriş

Elasticsearch'e Giriş

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