Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender...

70
Elasticsearch for SQL Users Philipp Krenn @xeraa

Transcript of Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender...

Page 1: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Elasticsearchfor SQL UsersPhilipp Krenn @xeraa

Page 2: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Infrastructure | Developer Advocate

Page 3: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

ViennaDBPapers We Love Vienna

Page 4: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

AgendaEcosystemArchitecture

QueriesSchema

Conclusion

Page 5: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Ecosystem

Page 6: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

You Know, for Search

Page 7: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),
Page 8: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),
Page 9: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

ELK Stack

Page 10: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),
Page 11: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),
Page 12: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),
Page 13: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),
Page 14: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Elastic Stack

Page 15: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),
Page 16: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),
Page 17: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Architecture

Page 18: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Apache LuceneLibrary

Index, store, search

Page 19: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

ElasticsearchDistribution

RESTQuery DSL

Page 20: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

IndexType

Document

Page 21: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

ClusterIndex

Shard & Replica

Page 22: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Topology

Page 23: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Write

Page 24: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Immutable Segments

Page 25: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Immutable Segments

Page 26: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Schema-Free Is a Lie!Dynamic mapping

Page 27: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

CREATE TABLE IF NOT EXISTS emails ( sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024), body MEDIUMTEXT, datetime DATETIME);

CREATE INDEX emails_sender ON emails(sender);CREATE FULLTEXT INDEX emails_subject ON emails(subject);CREATE FULLTEXT INDEX emails_body ON emails(body);

Page 28: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

PUT /communication{ "mappings": { "email": { "properties": { "sender": { "type": "keyword" }, "recipients": { "type": "keyword" }, "cc": { "type": "keyword" }, "bcc": { "type": "keyword" }, "subject": { "type": "text", "analyzer": "english" }, "body": { "type": "text", "analyzer": "english" } } } }}

Page 29: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Beware of the Reindex

Page 30: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Queries

Page 31: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Let's Add Some Data

POST /communication/email{ "sender": "[email protected]", "recipients": [ "[email protected]" ], "cc": [], "subject": "Elasticsearch is pretty cool", "body": "Hey Philipp, this is great stuff. Check it out!"}

Page 32: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Let's Add Some Data

POST /communication/email{ "sender": "[email protected]", "recipients": [ "[email protected]" ], "cc": [ "[email protected]" ], "subject": "Thanks for creating Elasticsearch", "body": "David pointed me to your project. It's awesome"}

Page 33: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Let's Add Some Data

POST /communication/email{ "sender": "[email protected]", "recipients": [ "[email protected]" ], "cc": [], "subject": "We should hire Philipp", "body": "He is really into the project and will do great things."}

Page 34: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Get All the Data

POST /communication/_search{ "query": { "match_all": { } }}

Page 35: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Find great

POST /communication/_search{ "query": { "match": { "body": "great" } }}

Page 36: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

text vs keywordtext (default) is analyzed

keyword is not

Page 37: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Analyzed Text

PUT /cities/city/1{ "city": "Sandusky", "population": 25340}PUT /cities/city/2{ "city": "New Albany", "population": 8829}PUT /cities/city/3{ "city": "New York", "population": 8406000}

Page 38: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Analyzed TextStop words, stemming, synonyms, fuzzying,...

Page 39: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Analyzed Text

POST /cities/_search{ "query": { "match": { "city": "New Albany" } }}

Page 40: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Not Analyzed Text

DELETE /citiesPUT /cities{ "mappings": { "city": { "properties": { "city": { "type": "keyword" } } } }}

Page 41: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Not Analyzed Text

POST /cities/_search{ "query": { "match": { "city": "New Albany" } }}

Page 42: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Search for great stuff

POST /communication/_search{ "query": { "match": { "body": "great stuff" } }}

Page 43: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Search for the Phrase great stuff

POST /communication/_search{ "query": { "match_phrase": { "body": "great stuff" } }}

Page 44: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Multiple Fields

POST /communication/_search{ "query": { "multi_match": { "query": "Philipp", "fields": [ "subject", "body" ] } }}

Page 45: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

BoostingPositive (>1) or negative (<1)

POST /communication/_search{ "query": { "multi_match": { "query": "Philipp", "fields": [ "subject^3", "body" ] } }}

Page 46: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Fuzziness

POST /communication/_search{ "query": { "match": { "body": { "query": "awsome", "fuzziness": 1 } } }}

Page 47: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Lots MoreBoolean (must, must_not, should, minimum_should_match)

HighlightingSearch and scroll

Geo

Page 48: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

(Pipelined) AggregationsExample: Group by day, sum, moving average

Page 49: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Schema

Page 50: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Application-Side Joins

PUT /blog/author/1{ "name": "Philipp", "bio": "..."}PUT /blog/post/1{ "author_id": 1, "title": "...", "body": "..."}PUT /blog/post/2{ "author_id": 1, "title": "...", "body": "..."}

Page 51: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Application-Side Joins

POST /blog/author/_search{ "query": { "match": { "name": "Philipp" } }}

POST /blog/post/_search{ "query": { "match": { "author_id": <each id from query 1 result> } }}

Page 52: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Data Denormalization

PUT /blog/post/1{ "author_name": "Philipp", "title": "...", "body": "..."}PUT /blog/post/2{ "author_name": "Philipp", "title": "...", "body": "..."}

Page 53: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Data Denormalization

POST /blog/post/_search{ "query": { "match": { "author_name": "Philipp" } }}

Page 54: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Nested Objects

PUT /blog/author/1{ "name": "Philipp", "bio": "...", "blog_posts": [ { "title": "...", "body": "..." }, { "title": "...", "body": "..." }, { "title": "...", "body": "..." } ]}

Page 55: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Nested Objects

POST /blog/author/_search{ "query": { "match": { "name": "Philipp" } }}

Page 56: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Parent-Child Documents

PUT /blog{ "mappings": { "author": {}, "post": { "_parent": { "type": "author" } } }}

Page 57: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Parent-Child Documents

PUT /blog/author/1{ "name": "Philipp", "bio": "..."}PUT /blog/post/1?parent=1{ "title": "...", "body": "..."}PUT /blog/post/2?parent=1{ "title": "...", "body": "..."}

Page 58: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Parent-Child Documents

POST /blog/post/_search{ "query": { "has_parent": { "type": "author", "query": { "match": { "name": "Philipp" } }}

Page 59: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Conclusion

Page 60: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Many QueriesSearch, boolean aggregate, geo,...

Page 61: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

text vs keyword

Page 62: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

SchemaApplication, denormalization, nesting, parent-child

Page 63: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Getting Data from Your RDBMSRDBMS trigger

LogstashForked writes from your application

Page 64: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Can I use it as a primary datastore?

It dependshttps://www.elastic.co/guide/en/elasticsearch/

resiliency/current/index.html

Page 65: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

How fast is it?

Page 66: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Datastore, logs, metrics, analytics,...

Page 67: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),
Page 68: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Morehttps://www.elastic.co/training

Amsterdam: Nov 21-24

Page 69: Elasticsearch for SQL Users - Percona · PDF fileCREATE TABLE IF NOT EXISTS emails (sender VARCHAR(255) NOT NULL, recipients TEXT, cc TEXT, bcc TEXT, subject VARCHAR(1024),

Thanks!

Questions?Philipp Krenn @xeraa

PS: Stickers