Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Elasticsearch

 Elasticsearch

Presentation held at the JavaLand Conference in Brühl, Germany, on March 25, 2014.

Patrick Peschlow

March 25, 2014
Tweet

More Decks by Patrick Peschlow

Other Decks in Technology

Transcript

  1. codecentric AG Lucene oberflächlich Feld_1: <Attribute, Wert> Feld_2: <Attribute, Wert>

    ... Dokument Analyse Index Feld_2: <Suchbegriff> Query Analyse
  2. codecentric AG Elasticsearch = Lucene + … − Server !

    − REST API ! − Skalierbarkeit ! − Sinnvolle Default-Einstellungen bzw. Default-Verhalten ! − Viele zusätzliche „Advanced Features“
  3. 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" } } } } } }}'
  4. 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." } }'
  5. 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." } } ] } }
  6. 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." } } ] } }
  7. 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
  8. 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
  9. 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)
  10. 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)
  11. 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
  12. codecentric AG Lucene Innereien Sichtbar für neu geöffnete Reader Segment

    flush() Segment flush() commit() Synced to Disk Auf Wunsch sichtbar via NRT
  13. codecentric AG Lucene Innereien Segment flush() Segment flush() commit() Synced

    to Disk Heuristische Ausführung (oder explizit durch NRT) Expliziter Aufruf (Transaktion)
  14. codecentric AG Transaction Log Segment flush() Synced to Disk Persistiert

    refresh() Segment flush() commit() + Öffne Reader neu
  15. codecentric AG Transaction Log Segment flush() Persistiert refresh() Segment flush()

    Heuristische Ausführung Regelmäßige Ausführung commit() Synced to Disk + Öffne Reader neu
  16. codecentric AG Sharding + Replication Node 1 Node 2 Primary

    1 Primary 2 Primary 3 Replica 2 Replica 3 Replica 1 Master
  17. 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
  18. 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!
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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."} ] } }'
  26. codecentric AG Relationen curl -XPOST 'http://localhost:9200/blog/_search' -d '{ query: {

    bool: { must: [ {term: {"comments.author": "Daniel Schneller"}}, {match: {"comments.text": "Schade"}} ] } } }'
  27. 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 : ... } ] } }
  28. 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
  29. 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
  30. codecentric AG Beachtenswerte Features in Elasticsearch 1.0 − Snapshot/Restore !

    − Aggregations ! − Federated Search ! − Circuit Breaker
  31. 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
  32. 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
  33. 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