Slide 1

Slide 1 text

codecentric AG Patrick Peschlow Elasticsearch

Slide 2

Slide 2 text

codecentric AG Suche

Slide 3

Slide 3 text

codecentric AG Suche

Slide 4

Slide 4 text

codecentric AG Suche

Slide 5

Slide 5 text

codecentric AG Suche

Slide 6

Slide 6 text

codecentric AG Lucene oberflächlich Feld_1: Feld_2: ... Dokument Analyse Index Feld_2: Query Analyse

Slide 7

Slide 7 text

codecentric AG Elasticsearch = Lucene + … − Server ! − REST API ! − Skalierbarkeit ! − Sinnvolle Default-Einstellungen bzw. Default-Verhalten ! − Viele zusätzliche „Advanced Features“

Slide 8

Slide 8 text

codecentric AG Mapping curl -XPUT 'http://localhost:9200/blog' -d '{mappings: { article: { properties: { author: { type: "string", index: "not_analyzed" }, content: { type: "string", index: "analyzed", analyzer: "german" }, comments: { properties: { author: { type: "string", index: "not_analyzed" }, text: { type: "string", index: "analyzed", analyzer: "german" } } } } } }}'

Slide 9

Slide 9 text

codecentric AG Indizierung curl -XPUT 'http://localhost:9200/blog/article/1' -d '{ { author: "Patrick Peschlow", content: "Dieser Artikel ist so kurz, weil ich nicht mehr Zeit hatte." } }'

Slide 10

Slide 10 text

codecentric AG Suche curl -XPOST 'http://localhost:9200/blog/article/_search' -d '{ query: { match: { content: "kurze" } } }'

Slide 11

Slide 11 text

codecentric AG Suche curl -XPOST 'http://localhost:9200/blog/article/_search' -d '{ query: { match: { content: "kurze" } } }' ! { hits: { total: 1, hits: [ { _id: "1", _score: 0.15342641, _source : { author: "Patrick Peschlow", content: "Dieser Artikel ist so kurz, weil ich nicht mehr Zeit hatte." } } ] } }

Slide 12

Slide 12 text

codecentric AG Suche curl -XPOST 'http://localhost:9200/blog/article/_search' -d '{ query: { term: { author: "Patrick Peschlow" } } }'

Slide 13

Slide 13 text

codecentric AG Suche curl -XPOST 'http://localhost:9200/blog/article/_search' -d '{ query: { term: { author: "Patrick Peschlow" } } }' ! { hits: { total: 1, hits: [ { _id: "1", _score: 0.30685282, _source : { author: "Patrick Peschlow", content: "Dieser Artikel ist so kurz, weil ich nicht mehr Zeit hatte." } } ] } }

Slide 14

Slide 14 text

codecentric AG Tipps zum Mapping − Falls nicht benötigt: _all-Feld abschalten ! − Falls nicht benötigt: _source-Feld abschalten ! − Falls _source verwendet wird, keine einzelnen Felder mehr auf _stored setzen ! − Falls nicht benötigt: Schalte dynamic mapping ab ! − Verwende not_analyzed, wenn Werte unverändert indiziert werden sollen

Slide 15

Slide 15 text

codecentric AG Tipps zur Suche − Verwende Filter statt Queries, wann immer möglich − Viele Filter (z.B. Term-Filter) können gecached werden − „Nur Filter“ lässt sich mit constant_score-Query oder match_all-Query realisieren

Slide 16

Slide 16 text

codecentric AG Tipps zur Suche − Verwende Filter statt Queries, wann immer möglich − Viele Filter (z.B. Term-Filter) können gecached werden − „Nur Filter“ lässt sich mit constant_score-Query oder match_all-Query realisieren ! − Zusammengesetzte Filter (bool/and/or/not) werden nicht gecached − Es kann sich aber lohnen, das explizit zu verlangen (_cache setzen)

Slide 17

Slide 17 text

codecentric AG Tipps zur Suche − Verwende Filter statt Queries, wann immer möglich − Viele Filter (z.B. Term-Filter) können gecached werden − „Nur Filter“ lässt sich mit constant_score-Query oder match_all-Query realisieren ! − Zusammengesetzte Filter (bool/and/or/not) werden nicht gecached − Es kann sich aber lohnen, das explizit zu verlangen (_cache setzen) ! − Bevorzuge bool-Filter vor and/or/not, wenn sie Cached-Filter kombinieren − Denn and/or/not benutzen den Cache nicht (aber: andere Vorteile)

Slide 18

Slide 18 text

codecentric AG Tipps zur Suche − Verwende Filter statt Queries, wann immer möglich − Viele Filter (z.B. Term-Filter) können gecached werden − „Nur Filter“ lässt sich mit constant_score-Query oder match_all-Query realisieren ! − Zusammengesetzte Filter (bool/and/or/not) werden nicht gecached − Es kann sich aber lohnen, das explizit zu verlangen (_cache setzen) ! − Bevorzuge bool-Filter vor and/or/not, wenn sie Cached-Filter kombinieren − Denn and/or/not benutzen den Cache nicht (aber: andere Vorteile) ! − Es gibt verschiedene Möglichkeiten, Filter anzuwenden − Je nachdem findet die Ausführung vor oder nach dem Query statt − Beeinflusst den Scope von Facetten im selben Request − Meistens ist „filtered query“ das, was man benötigt

Slide 19

Slide 19 text

codecentric AG Lucene Innereien

Slide 20

Slide 20 text

codecentric AG Lucene Innereien Segment flush()

Slide 21

Slide 21 text

codecentric AG Lucene Innereien Segment flush()

Slide 22

Slide 22 text

codecentric AG Lucene Innereien Segment flush() Segment flush()

Slide 23

Slide 23 text

codecentric AG Lucene Innereien Segment flush() Segment flush() commit() Synced to Disk

Slide 24

Slide 24 text

codecentric AG Lucene Innereien Sichtbar für neu geöffnete Reader Segment flush() Segment flush() commit() Synced to Disk Auf Wunsch sichtbar via NRT

Slide 25

Slide 25 text

codecentric AG Lucene Innereien Segment flush() Segment flush() commit() Synced to Disk Heuristische Ausführung (oder explizit durch NRT) Expliziter Aufruf (Transaktion)

Slide 26

Slide 26 text

codecentric AG Transaction Log

Slide 27

Slide 27 text

codecentric AG Transaction Log Persistiert

Slide 28

Slide 28 text

codecentric AG Transaction Log Persistiert refresh()

Slide 29

Slide 29 text

codecentric AG Transaction Log Persistiert + Öffne Reader
 neu für NRT refresh() Segment flush()

Slide 30

Slide 30 text

codecentric AG Transaction Log Persistiert + Öffne Reader
 neu für NRT refresh() Segment flush()

Slide 31

Slide 31 text

codecentric AG Transaction Log flush() Persistiert + Öffne Reader
 neu für NRT refresh() Segment flush()

Slide 32

Slide 32 text

codecentric AG Transaction Log Segment flush() Synced to Disk Persistiert refresh() Segment flush() commit() + Öffne Reader neu

Slide 33

Slide 33 text

codecentric AG Transaction Log Segment flush() Persistiert refresh() Segment flush() Heuristische Ausführung Regelmäßige Ausführung commit() Synced to Disk + Öffne Reader neu

Slide 34

Slide 34 text

codecentric AG Transaction Log Alle Dokumente persistiert und suchbar: Transaction Log kann geleert werden

Slide 35

Slide 35 text

codecentric AG Sharding + Replication Node 1 Node 2 Primary 1 Primary 2 Primary 3 Replica 2 Replica 3 Replica 1 Master

Slide 36

Slide 36 text

codecentric AG Sharding + Replication − „Routing“ − In welchen Shard wird ein Dokument indiziert? − In welchen Shards wird gesucht? − Default: Basierend auf Dokument-ID − Kann aber überschrieben werden ! − Anzahl Shards wird bei Anlegen eines Indexes final festgelegt ! − Anzahl Replicas kann dynamisch geändert werden ! − Es gibt exakt einen Master-Knoten im Cluster

Slide 37

Slide 37 text

codecentric AG Cluster-Status − „Shard-Status“ − rot = Primary Shard ist nicht angelegt − gelb = Primary Shard ist angelegt, aber nicht alle verlangten Replicas − grün = Alle Shards sind angelegt ! − „Index-Status“ = Schlechtester Status aller Shards des Indexes ! − „Cluster-Status“ = Schlechtester Status aller Indexe des Clusters ! − „Wait Until“: Möglichkeit, auf den gewünschten Status zu warten ! − Beachte: Auch bei Cluster-Status Rot funktioniert noch so einiges!

Slide 38

Slide 38 text

codecentric AG Tipps zum Cluster − Cluster-Zugang absichern − Eindeutiger Cluster-Name − Unicast- vs. Multicast-Discovery ! − Allocation Awareness − Praktisch beliebige Regeln, damit Shards nur auf bestimmten Knoten angelegt werden − Indizes können ebenfalls Einschränkungen definieren ! − Knoten können verschiedene Fähigkeiten haben − „master“, „data“, „client“ − Ermöglicht Architektur mit Aggregator-Knoten ! − Gefährlicher Default: minimum_master_nodes = 1

Slide 39

Slide 39 text

codecentric AG Konsistenz-Parameter bei Indizierung − „consistency“ − Werte: all, quorum, one − Default: quorum − Wie viele Shards müssen da sein, damit die Operation zulässig ist? ! − „replication=async“ − Kehrt bereits nach Indizierung auf dem Primary Shard zurück − Default: Vollständige Replikation wird abgewartet

Slide 40

Slide 40 text

codecentric AG Konsistenz-Parameter bei Suche − „preference“ − Legt fest, auf welchem Shard die Suche ausgeführt werden darf − Werte: Lokal, nur Primary, nur bestimmte Shards, nur bestimmte Nodes, etc. − Außerdem: Beliebiger String möglich, z.B. für einheitliche Sicht pro User − Default: Round-Robin

Slide 41

Slide 41 text

codecentric AG Beispiel

Slide 42

Slide 42 text

codecentric AG Beispiel

Slide 43

Slide 43 text

codecentric AG Beispiel

Slide 44

Slide 44 text

codecentric AG Beispiel

Slide 45

Slide 45 text

codecentric AG Index-Aliasse − Anderer Name für einen (oder mehrere) Indexe − Entkopplung von Client-Sicht und physikalischem Storage ! − Anwendungsgebiete: − Zero-Downtime-Änderungen und -Migrationen − Views auf mehrere Indizes

Slide 46

Slide 46 text

codecentric AG Index-Aliasse − Anderer Name für einen (oder mehrere) Indexe − Entkopplung von Client-Sicht und physikalischem Storage ! − Anwendungsgebiete: − Zero-Downtime-Änderungen und -Migrationen − Views auf mehrere Indizes ! − Dynamische Assoziation mit Query möglich − Interessant für Zugriffsberechtigungen GET /user1234 GET /all user=user1234 groups=group1 /all

Slide 47

Slide 47 text

codecentric AG Tipps zur Skalierung − Anzahl Shards sollte basierend auf Schätzungen/Berechnungen gewählt werden − Eine leichte Überallokation ist in Ordnung − Andererseits nicht zu viel, denn Shards benötigen Ressourcen ! − Wenn die Datenmenge doch größer wird, helfen Aliasse − Einen weiteren, identischen Index anlegen − Neue Dokumente nur dem neuen Index hinzufügen − Ein Alias definieren, so dass in beiden Indexen gemeinsam gesucht wird − Ideal: Direkt von Beginn an mit Aliassen arbeiten ! − Merke: − Suche in einem Index mit 50 Shards = Suche in 50 Indexen mit jeweils einem Shard − Denn in beiden Fällen werden 50 Lucene-Indexe durchsucht

Slide 48

Slide 48 text

codecentric AG Relationen curl -XPUT 'http://localhost:9200/blog/article/1' -d '{ { author: "Patrick Peschlow", content: "Dieser Artikel ist so kurz, weil ich nicht mehr Zeit hatte.“, comments: [ {author: "Lukas Pustina", text: "Schade."}, {author: "Daniel Schneller", text: "Wie zu erwarten war."} ] } }'

Slide 49

Slide 49 text

codecentric AG Relationen curl -XPOST 'http://localhost:9200/blog/_search' -d '{ query: { bool: { must: [ {term: {"comments.author": "Daniel Schneller"}}, {match: {"comments.text": "Schade"}} ] } } }'

Slide 50

Slide 50 text

codecentric AG Relationen curl -XPOST 'http://localhost:9200/blog/_search' -d '{ query: { bool: { must: [ {term: {"comments.author": "Daniel Schneller"}}, {match: {"comments.text": "Schade"}} ] } } }' ! { hits: { total: 1, hits: [ { _id: "1", _source : ... } ] } }

Slide 51

Slide 51 text

codecentric AG Relationen − Dokumentstruktur von Lucene ist flach ! − Das gilt auch für verschachtelte JSON-Objekte bei Elasticsearch ! − Zwei Lösungen − Nested Objects − Parent/Child Mapping

Slide 52

Slide 52 text

codecentric AG Percolator − Speichere Queries, um später zu prüfen ob Dokumente matchen − Ermöglicht Suchaufträge ! − Zusätzlicher .percolate-Type im selben Index wie die eigentlichen Dokumente ! − Einschränkung: − Ab Elasticsearch 1.0 ist kein kombiniertes „Index and percolate“ mehr möglich − Es bleibt: Percolate von bereits indizierten Dokumenten − Oder: Direktes Percolate ohne Indizierung − Grund: Verteilte Implementierung des Percolators

Slide 53

Slide 53 text

codecentric AG Plugins: Head

Slide 54

Slide 54 text

codecentric AG Plugins: Kopf

Slide 55

Slide 55 text

codecentric AG Plugins: Bigdesk

Slide 56

Slide 56 text

codecentric AG Plugins: Paramedic

Slide 57

Slide 57 text

codecentric AG Plugins: HQ

Slide 58

Slide 58 text

codecentric AG Plugins: SegmentSpy

Slide 59

Slide 59 text

codecentric AG Plugins: Inquisitor

Slide 60

Slide 60 text

codecentric AG Beachtenswerte Features in Elasticsearch 1.0 − Snapshot/Restore ! − Aggregations ! − Federated Search ! − Circuit Breaker

Slide 61

Slide 61 text

codecentric AG Fragen? Dr. rer. nat. Patrick Peschlow
 codecentric AG
 Merscheider Straße 1
 42699 Solingen
 
 tel +49 (0) 212.23 36 28 54
 fax +49 (0) 212.23 36 28 79
 [email protected]
 
 www.codecentric.de

Slide 62

Slide 62 text

codecentric AG Tipps zu Produktion − Allgemeine Performance-Empfehlungen beachten − Geeignete Heap-Größe − Swapping vermeiden − Hinreichend großes FD-Limit − Nicht zu schwache Hardware (mindestens „medium“, besser „large“) − SSDs ! − Features wie Doc Values verwenden ! − Threadpool-Größen prüfen und ggf. ändern ! − Monitoring − API stellt sehr viele Informationen bereit

Slide 63

Slide 63 text

codecentric AG Update API − Zwei Möglichkeiten − Partial Document − Script ! − Achtung − Auch feingranulare Updates bedeuten intern „Löschen + Hinzufügen“ − Updates benötigen _source − Partial Document Update von inneren Objekten ist ein Merge, alles sonst ein Replace − Partial Document und Script können nicht miteinander kombiniert werden