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 Detailsgeosuche 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.
CURL -X .../
say hello.
X
- 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
!%$" itCURL -X .../
X
- einfaches hnzufügen von Daten
- nur Json
- daten werden als original gespeichert
- daten werden indiziert - inverted index
- Arrays und Unterelemente möglich
!%$" itCURL -X .../
X
- einfache Suchanfrage
- gibt alles zurück - size von 10
- keine Bedingungen
!%$" itCURL -X .../
X
- Suche nach einem Term
- Term entspricht einem Token!
- Token muss nur in dem Text vorkommen, anders als bei MySql
!%$" itCURL -X .../
X
- Suche nach mehreren Terms
!%$" itCURL -X .../
X
- Was passiert nun?
- ausführen!!
- Warum gibt es kein Ergebnis?
- Tokenizer und #
- Warum gab es vorher ein Ergebnis? - nochmal zurück!!
!%$" itbe 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?
CURL -X .../
X
- 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
!%$" itCURL -X .../
X
- queries lassen sich beliebig schachteln
- unterschiedliche query typen sind kombinierbar
- wir haben 2 term queries und 2 bool queries
- sehr komplexe Queries möglich
!%$" it- 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
CURL -X .../
X
- 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?
!%$" itCURL -X .../
multiple facets
X
- 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
!%$" itdifferent 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
CURL -X .../
combine query and facets.
X
- Query kombiniert mit Facetten
- Suchergebnis + Facetten Ergebnisse
- Facetten nutzten die Query um sich selbst zu filtern
- Query bezieht sich immer auf alles
!%$" it- 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
CURL -X .../
X
- 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
!%$" it
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
CURL -X .../
Index an int
X
- Als erstes ein Int anlegen
!%$" itCURL -X .../
try to index a string to the same field ...
X
- Versuch einen String in identisches Feld zu speichern - scheitert
- Andersrum wäre es möglich!
!%$" it
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.
CURL -X .../
add the mapping
X
- Mappings sind einfach
- Erste Node - Type
- Felder als Properties
- Type für den Feldtypen
- Weitere möglichkeiten wie nutzung von analyzer, tokenizer. - eigene Analyzer, ...
!%$" itCURL -X .../
get the mapping
X
- Auslesen des Mappings - GET Request
- Erratende Mppings lassen sich auch auslesen
!%$" itCURL -X .../
Proof
X
!%$" itremapping 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
CURL -X .../
there are a bunch of tokenizers:
Edge NGram, Keyword, Letter, Lowercase, NGram, Standard, Whitespace, Pattern, UAX URL Email, Path Hierarchy
X
- 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
!%$" itCURL -X .../
there are a bunch of tokenfilters:
Standard, ASCII Folding, Length, Lowercase, NGram, Edge NGram, Porter Stem, Shingle, Stop, Word Delimiter, Stemmer, and 15 more...
X
Popular Mechanics, US-Technik-Magazin, 1949
- filter wie Lowercase, Stopwörter u.s.w.
!%$" itGui's
bigdeskelasticsearch-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