elasticsearch.



elasticsearch.

0 1


slides_elasticsearch


On Github timglabisch / slides_elasticsearch

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
!%$" it

CURL -X .../

X
  • einfaches hnzufügen von Daten
  • nur Json
  • daten werden als original gespeichert
  • daten werden indiziert - inverted index
  • Arrays und Unterelemente möglich
!%$" it
src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java#L57
  • Module registrieren in netty Handler
  • Diese können über die Url angesprochen werden
  • Index = Datenbank
  • Type = Tabelle
  • Dahinter die Action
  • Action beginnent mit einem _
  • id wurde generiert

CURL -X .../

X
  • einfache Suchanfrage
  • gibt alles zurück - size von 10
  • keine Bedingungen
!%$" it

CURL -X .../

X
  • Suche nach einem Term
  • Term entspricht einem Token!
  • Token muss nur in dem Text vorkommen, anders als bei MySql
!%$" it

CURL -X .../

X
  • Suche nach mehreren Terms
!%$" it

CURL -X .../

X
  • Was passiert nun?
  • ausführen!!
  • Warum gibt es kein Ergebnis?
  • Tokenizer und #
  • Warum gab es vorher ein Ergebnis? - nochmal zurück!!
!%$" it

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?

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
!%$" it

CURL -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

facets

  • 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?
!%$" it

CURL -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
!%$" it

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

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

routing

  • 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!

Mappings

Elasticseatch isn't schemaless.

  • Schemaless steht auf der Startseite
  • Lüge!
  • Beweis folgt

CURL -X .../

Index an int

X
  • Als erstes ein Int anlegen
!%$" it

CURL -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, ...
!%$" it

CURL -X .../

get the mapping

X
  • Auslesen des Mappings - GET Request
  • Erratende Mppings lassen sich auch auslesen
!%$" it

CURL -X .../

Proof

X
!%$" it

CURL -X .../

X
!%$" it

remapping sucks

  • Probleme welche man nicht Live haben will!

tokenizer

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
!%$" it

CURL -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.
!%$" it

there is so much more...

Gui'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

questions?

thx.