elasticsearch.
flexible and powerful open source, distributed real-time
search and analytics engine for the cloud
by @timglabisch
Danke fürs kommen.
Ich bin Tim Glabisch , arbeite für AnyMotion Graphics .
Hab schon mehrfach festgestellt, dass Suchen mit einer Relationalen Datenbank keinen Spass machen.
Performance
viel Aufwand
Features fehlen - Volltextsuchen, Facetten, u.s.w.
fork me on github!
fast alles paktische Beispiele !
is for search
kein Ersatz für relationale Datenbanken
kein Ersatz für NoSql Datenbanken - oder?
has brilliant defaults
großartige Standards
Automapping
"Tabellen" werden beim Insert von Daten angelegt
Server finden sich automatisch
Schneller Einstieg
is flexible
change everything
complex queries
war oft erstaunt was es alles kann und wie man dies beeinflussen kann
Durchdachte Details geosuche mir beliebigen Formen auf der Karte
modular - plugin api's - google guice
verständlicher und sauber programmiert
Beispiel einer Suchmaske
Github
Suchwort 42 - nicht nach der Antwort suchen :)
Facetten - Aggregatoren
Facetten - Relatione Datenbank!?
Facetten brauchen RAM !
Highlighting von Textstücken
Advanced Search
Real time data , Real time analytics, Distributed, High availability, Multi-tenancy, Full text search
Document oriented, Conflict management, Schema free , RESTful API , Per-operation persistence,
Apache 2 Open Source License, Build on top of Apache Lucene ™
so beschreibt sich Elasticsearch
fast alles für heute unwichtig!
Realtime kann nicht jeder Suchserver - Realtime bedeutet wenige Sekunden nach dem Indizieren
Elasticsearch nutzt Rest
lots of api's...
Search >
Query, Highlighting, Suggest, Facets, Min Score, Scroll, Explain, Version, ...
Indices >
Aliases, Analyze, Create Index, Delete Index, Open/Close Index, Get Settings, Get Mapping, Put Mapping, Delete Mapping,
Refresh, Optimize, Flush, Snapshot, Update Settings, Templates, Warmers, Stats, Status, Segments, Clear Cache, Indices Exists, Types Exists, ...
Cluser >
Health, State, Update Settings, Nodes Info, Nodes Stats, Nodes Shutdown, Nodes Hot Threads, Cluster reroute
Complex Queries >
match, multi_match, bool, boosting, ids, custom_score, custom_boost_factor, constant_score, dis_max,
field, filtered, flt, flt_field, fuzzy, has_child, has_parent, match_all, mlt, mlt_field, prefix,
query_string, range, span_first, span_near, span_not, span_or, span_term, term, terms, top_children, wildcard,
nested, custom_filters_score, indices, text, geo_shape, and, bool, exists, ids, limit, type, geo_bbox, geo_distance, geo_distance_range,
geo_polygon, geo_shape, has_child, has_parent, match_all, missing, not, numeric_range, or, prefix, query, range, script, term
terms, nested
Routings > ...
Mappings > ...
Modules > ...
River > ...
...
bitte nicht lesen !
es kann viel. wirklich. - detailverliebte api
Manual ist vollständig - aber wirklich ein Handbuch .
Buch - Jede Seite neue Funktionen.
Funktionen sind kombinierbar und wirklich sinnvoll und flexibel !
elasticsearch
in action...
genug der theorie
wir schauen uns das an, was für eure erste Suchanwendung wichtig .
mein Ziel - ihr geht nach hause und könnt eine 0-8-15 Suchmaske bauen .
install
1. Download and unzip the latest Elasticsearch distribution.
2. Run bin/elasticsearch -f on Unix.
installation ist einfach
runterladen
ausführen
default Einstellungen sind alle brauchbar!
init Skripte runderladen.
bin/elasticsearch -f
-f für frontend , zeigt Fehler
startet auf nächstem freien Port ab port 9200
super zum debuggen
strg + C zum beenden
als Service einfach ohne -f
ihr könnt auch mehrere Instanzen starten
org/elasticsearch/node/internal/InternalNode.java#L136
elasticsearch ist modular
code sieht sehr sauber aus
veschiedene module werden gestartet
nutzt netty und guice
plugin api vorhanden
discovery modul findet andere Instanzen - broadcast, ip liste, amazon, ...
Rest modul für alle Rest anfragen
Bulk modul für größere Mengen von Daten, Udp auch möglich.
say hello.
editor habe ich gabaut
oben die url und die http methode
unten der senden button
response öffnet sich asap
Name ist einer von 3500 Comic helden - by Default
{
"user" : "timglabisch",
"message" : "#elasticsearch is #awesome",
"tags" : ["elasticsearch", "awesome"]
}
einfaches hnzufügen von Daten
nur Json
daten werden als original gespeichert
daten werden indiziert - inverted index
Arrays und Unterelemente möglich
einfache Suchanfrage
gibt alles zurück - size von 10
keine Bedingungen
{
"query" : {
"term": {
"user" : "timglabisch"
}
}
}
Suche nach einem Term
Term entspricht einem Token!
Token muss nur in dem Text vorkommen, anders als bei MySql
{
"query" : {
"term": {
"user" : "timglabisch",
"message" : "#elasticsearch"
}
}
}
Suche nach mehreren Terms
{
"query" : {
"term": {
"message" : "#elasticsearch"
}
}
}
Was passiert nun?
ausführen!!
Warum gibt es kein Ergebnis?
Tokenizer und #
Warum gab es vorher ein Ergebnis? - nochmal zurück!!
be aware
- term queries use OR by default!
- know the tokenizer, there is no # elasticsearch token!
ODER / OR
merkt euch die Slide
war mein erster "Fehler" mit elasticsearch
wie aber setzen wir es dann um?
{
"query" : {
"bool": {
"must": [
{
term: {"message" : "elasticsearch" }
},
{
term: {"user" : "timglabisch" }
}
]
}
}
}
bool query
mehrere Subqueries
must, must not, should
bei should kann man bei mehreren unterabfragen definieren wieviele mind zutreffen müssen
treffer bei should erhöhen das Ranking - boosting
{
"query" : {
"bool": {
"must": [
{
term: {"message" : "elasticsearch" }
},
{
bool: {
"must" : {
term: {"user" : "timglabisch" }
}
}
}
]
}
}
}
queries lassen sich beliebig schachteln
unterschiedliche query typen sind kombinierbar
wir haben 2 term queries und 2 bool queries
sehr komplexe Queries möglich
- json is awesome to build queries .
- easy to write complex queries
- mix different query types
match, multi_match, bool , boosting, ids, custom_score,
custom_boost_factor, constant_score, dis_max, field, filtered, flt,flt_field,
fuzzy, has_child, has_parent, match_all, mlt, mlt_field, prefix, query_string,
range, span_first, span_near, span_not, span_or, span_term, term , terms, top_children
wildcard, nested, custom_filters_score, indices, text, geo_shape
look at the manual
sql strings bauen ist fehleranfällig
ich habe schon kuriose möglichkeiten gesehen wie sql zusammengebaut wird
ich habe schn projekte gesehen die daran gescheitert sind
json zu modifizieren ist eine gute möglichkeit
viele verschiedene Suchtypen
beispielsweise kurioseste formen auf einer karte für geosuchen...
alle lassen sich kombinieren
Aggregationen
Performanceprobleme bei relationalen Datenbanken
können unterschiedliche filter beinhalen, z.b. eine programmiersprache
{
"size": 1,
"facets" : {
"i_am_just_an_identifier": {
"terms": { "field": "source" }
}
}
}
my_twitter_river - Twitter River Plugin für Elasticsearch
Sonntag, 35k Tweets in 10 min
Facetten haben einen identifier
Facetten haben eine beliebige Query, bzw. Filter - später mehr
Facetten betreffen immer ein Feld
von wo kommen Anfragen?
multiple facets
{
"size": 1,
"facets" : {
"i_am_just_an_identifier": {
"terms": { "field": "text" }
},
"i_am_just_another_identifier": {
"terms": { "field": "source" }
}
}
}
Mehrere Facetten sind möglich
Facetten könnnen unterschiedliche Filter haben
Facetten findet man über den Identfier wieder
Facetten sind sehr performant
Facetten brauchen Ram
Score 0 weil keine Query
different search phases.
src/main/java/org/elasticsearch/search/query/QueryPhase.java#L128
the breakpoint is awesome to debug the generated lucene query.
verschiedene Suchphasen
werden unabhängig von der Query Phast und der Suggestion Phase ausgeführt
eine Anfrage kann eine Query sowie Facetten beinhalten
stelle ist gut zum debuggen
elasticsearch hat hier die Anfrage zu einer Lucene Anfrage umgebaut
combine query and facets.
{
"size": 0,
"query" : {
"bool": {
"must": [
{
term: {"text" : "fuck" }
}
]
}
},
"facets" : {
"i_am_just_another_identifier": {
"terms": { "field": "source" }
},
"i_am_just_an_identifier": {
"terms": { "field": "text" }
}
}
}
Query kombiniert mit Facetten
Suchergebnis + Facetten Ergebnisse
Facetten nutzten die Query um sich selbst zu filtern
Query bezieht sich immer auf alles
zwei Beispiele
das Rote soll das Grüne nicht filtern
Facetten dürfen sich nicht selbst ausschließen
Oberkategorien sollen noch anzeigbar und anklickbar sein
Facetten müssen Filtermöglichkeiten beeinflussen können
Filters
Teilabfragen können unabhängig gefiltert werden.
Filter sind Subqueries die sich nur auf Teile der Abfrage beziehen - Facetten, Subqueries, ...
Filter sind performant
{
"size":16,
"facets":{
"provider":{
"terms":{
"field":"provider",
"size":35
},
"facet_filter":{
"bool":{
"must":[
{
"term":{
"level1":"Motor"
}
},
{
"term":{
"cars":"vw"
}
}
]
}
}
},
"cars":{
"terms":{
"field":"cars",
"size":35
},
"facet_filter":{
"bool":{
"must":[
{
"term":{
"level1":"Motor"
}
},
{
"term":{
"provider":"Top-Angebot"
}
}
]
}
}
},
// ....
},
"query":{
// jep we have a empty query ...
},
"filter":{
"bool":{
"must":[
{
"term":{
"level1":"Motor"
}
},
{
"term":{
"provider":"Top-Angebot"
}
},
{
"term":{
"cars":"vw"
}
}
]
}
}
}
erst hauptfilter anschauen - beinhaltet: level1, provider, cars
facette provider - beinhaltet level1, cars
facette cars - beinhaltet level1, provider
query ist leer
Der Hauptfilter beinhaltet die Filter für die Suchabfrage
Queries beziehen sich immer auf alles
Filter sind performant
Filter sind sehr flexibel
filters are awesome flexible, cacheable and reduce the number of requests.
Shards
Datenblöcke welche verschoben werden können
Daten werden automatisch in Shards unterteilt
Anzahl der Shards müssen beim Erstellen des Indizes bekannt sein
Kleine Datenmenge = wenig Shards
Weniger Shards = bessere Performance
Weniger Shards = weniger mögl. Daten
Daten werden unterteilt - Standard 5 Unterteilungen - auch auf einem Server
Bei vielen Daten bessere Performance
Bei wenig Daten schlechtere Performance
Durch reverted Index geringe Datenmengen
Eine Abfrage = Anfrage auf beide Shards
Optimiert durch Bloom Filter u.s.w.
Shards können auf 2 Servern liegen
Shards verschieben ist teuer
Steuerbar über API
Flexibel: Rack, Gruppen, ...
Default: 5
Replicas
Ausfallsicherheit
Performance
Kombination Replica und Shards
Ausfallsicherheit + Performance
Default - Fall genug Server vorhanden
Rot (Server C) fällt weg
Gelb (Server B, D) übernehmen einen Shard
Möglichkeit Performance zu verbessern
ohne Routing
alle Shards müssen angefragt werden
ergnisse aller Shards müssen aggregiert werden
ein Feld kann bestimmen auf welchem Shard es liegt
Anzahl der Shards stehen fest
routing by
- id (default)
- parameter ( /twitter/tweet?routing=timglabisch )
- custom field / path
Gut für die Performance
Möglichkeit für Kundenspzische Suchen, Kategorieabhängige, u.s.w.
Bei vielen Daten zu empfehlen!
Elasticseatch isn't schemaless.
Schemaless steht auf der Startseite
Lüge!
Beweis folgt
Index an int
{
"some_value": 1
}
Als erstes ein Int anlegen
try to index a string to the same field ...
{
"some_value": "i am just a string"
}
Versuch einen String in identisches Feld zu speichern - scheitert
Andersrum wäre es möglich!
the first value for a key maps your types.
sounds ugly but allows to start easy.
Mapping wird beim ersten Insert eines neuen Feldes erraten
Bitte nicht Produktiv so machen.
add the mapping
{
"schemaless_proof_2" : {
"properties" : {
"age" : {
"type" : "integer"
},
"name" : {
"type" : "string",
"search_analyzer": "keyword",
"index_analyzer" : "keyword"
}
}
}
}
Mappings sind einfach
Erste Node - Type
Felder als Properties
Type für den Feldtypen
Weitere möglichkeiten wie nutzung von analyzer, tokenizer. - eigene Analyzer, ...
get the mapping
Auslesen des Mappings - GET Request
Erratende Mppings lassen sich auch auslesen
Proof
{
"age": 4, "name" : 10
}
{
"age": 22, "name" : "Tim Glabisch"
}
remapping sucks
Probleme welche man nicht Live haben will!
by mata.gia.rwth-aachen.de
Tokenizer unterteilt Texte in Suchbare tokens
Man sucht immer nach Tokens - nicht nach Textblöcken (Vergleich Mysql Varchar Feld)
lowercase zeigen
ngram zeigen
ngram ist schneller als prefix
there are a bunch of tokenizers :
Edge NGram, Keyword, Letter, Lowercase, NGram, Standard, Whitespace, Pattern, UAX URL Email, Path Hierarchy
this is a text
bei marken namen: Coca Cola -> Coca und Cola oder "Coca Cola"
unterschiedlichste, E-Mails, Regex, ...
NGram Example vll. mal zeigen
NGram für Prefix Suche
there are a bunch of tokenfilters :
Standard, ASCII Folding, Length, Lowercase, NGram, Edge NGram, Porter Stem, Shingle, Stop, Word Delimiter, Stemmer, and 15 more...
Für die Zukunft sind
Computer mit weniger
als 1,5 Tonnen Gewicht vorstellbar.
Popular Mechanics, US-Technik-Magazin, 1949
filter wie Lowercase, Stopwörter u.s.w.
Gui's
bigdesk
elasticsearch-head
plain javascript / html
bigdesk - viele Statistiken, Monitoring, Replica, Überwachung Cluster
elasticsearch-head - Ajax Maske, Replica, Überwachung Cluster
wenns mal mehr werden
Übersicht der indizes
Übersicht der rechner
Gesundheit des clusters