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

Elasticsearch - Temel Kavramlar

Elasticsearch - Temel Kavramlar

Elasticsearch temel kavramlarından ve PHP Client kütüphanelerinden bahsediyoruz.

Bazı Kaynaklar :

http://elasticsearch.kulekci.net
https://github.com/hkulekci/es-presentation-examples

Haydar Külekci

March 03, 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 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. (Aggregation)
  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. 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.
  15. 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
  16. Update Arayüzü ### 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
  17. 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" } } } ✤ Önceki versiyonlarda bir eklenti ile kullanabilirsiniz. https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html
  18. ReIndex Arayüzü (Sadece 2.3’de) ### 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
  19. 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" } } }
  20. 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
  21. Terim Seviyesinde Sorgular ✤ `term` sorgusu ✤ `terms` sorgusu ✤

    `range` sorgusu ✤ `exists` sorgusu ✤ `missing` sorgusu ✤ `prefix` sorgusu ✤ `wildcard` sorgusu ✤ `fuzzy` sorgusu ✤ `ids` sorgusu
  22. 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
  23. 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, …)
  24. Terms Aggregations GET /listings/_search { "query" : { "term" :

    { "title" : "istanbul" } }, "aggs": { "type": { "terms": { "field": "type.label" } } } }
  25. Terms Aggregations { ... "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 } ] } } }
  26. 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
  27. Elasticsearch-PHP ✤ Elasticsearch’ün official PHP kütüphanesidir. ✤ Low-level bir kütüphanedir.

    ✤ Parametrelerinizi ilişkili array olarak alır ve URI üzerinden Elasticsearch API arayüzüne gönderir. https://github.com/elastic/elasticsearch-php
  28. Elastica ✤ Elastica Object Oriented bir yapıya sahip Elasticsearch client

    kütüphanesidir. ✤ QueryBuilder ile sorgularınızı oluşturabileceğiniz bir arayüz sunar. https://github.com/ruflin/Elastica