Slide 1

Slide 1 text

@kulekci Elasticsearch Haydar KÜLEKCİ

Slide 2

Slide 2 text

Elasticsearch nedir, ne işe yarar?

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Ne zaman kullanmalıyız, ne için kullanabiliriz?

Slide 5

Slide 5 text

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)

Slide 6

Slide 6 text

Cluster, Node, Index, Type, Document, Shards & Replicas

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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.

Slide 11

Slide 11 text

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.

Slide 12

Slide 12 text

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.

Slide 13

Slide 13 text

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" } ] }

Slide 14

Slide 14 text

Mapping nedir?

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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.

Slide 17

Slide 17 text

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" } } }

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Inverted Index https://lucene.apache.org/core/3_0_3/fileformats.html#Inverted Indexing

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Döküman Arayüzü (Document API)

Slide 22

Slide 22 text

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.

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Arama Arayüzü (Search API)

Slide 28

Slide 28 text

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" } } }

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

Full-Text Sorgular ✤ `match` sorgusu ✤ `query_string` sorgusu ✤ …

Slide 31

Slide 31 text

Terim Seviyesinde Sorgular ✤ `term` sorgusu ✤ `terms` sorgusu ✤ `range` sorgusu ✤ `exists` sorgusu ✤ `missing` sorgusu ✤ `prefix` sorgusu ✤ `wildcard` sorgusu ✤ `fuzzy` sorgusu ✤ `ids` sorgusu

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

Aggregations

Slide 34

Slide 34 text

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, …)

Slide 35

Slide 35 text

Terms Aggregations GET /listings/_search { "query" : { "term" : { "title" : "istanbul" } }, "aggs": { "type": { "terms": { "field": "type.label" } } } }

Slide 36

Slide 36 text

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 } ] } } }

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

PHP Client’ları

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

Elasticsearch-PHP

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

Elastica