Elastische Suche, mehrere Indizes gegen einen Index und Typen für verschiedene Datensätze?

161

Ich habe eine Anwendung, die unter Verwendung des MVC-Musters entwickelt wurde, und möchte jetzt mehrere Modelle davon indizieren. Dies bedeutet, dass jedes Modell eine andere Datenstruktur hat.

  • Ist es besser, mehrere Indizes zu verwenden, einen für jedes Modell oder einen Typ innerhalb desselben Index für jedes Modell? Beide Möglichkeiten würden meiner Meinung nach auch eine andere Suchabfrage erfordern. Ich habe gerade damit angefangen.

  • Gibt es Leistungsunterschiede zwischen beiden Konzepten, wenn der Datensatz klein oder groß ist?

Ich würde die zweite Frage selbst testen, wenn mir jemand gute Beispieldaten für diesen Zweck empfehlen könnte.

burzum
quelle

Antworten:

183

Beide Ansätze haben unterschiedliche Auswirkungen.

Angenommen, Sie verwenden die Standardeinstellungen von Elasticsearch. Wenn Sie 1 Index für jedes Modell haben, erhöht sich die Anzahl Ihrer Shards erheblich, da 1 Index 5 Shards verwendet und 5 Datenmodelle 25 Shards verwenden. Wenn Sie 5 Objekttypen in einem Index haben, werden immer noch 5 Shards verwendet.

Implikationen für jedes Datenmodell als Index:

  • Effiziente und schnelle Suche innerhalb des Index, da die Datenmenge in jedem Shard kleiner sein sollte, da sie auf verschiedene Indizes verteilt ist.
  • Das Durchsuchen einer Kombination von Datenmodellen aus zwei oder mehr Indizes führt zu Overhead, da die Abfrage an mehrere Shards über Indizes hinweg gesendet, kompiliert und an den Benutzer zurückgesendet werden muss.
  • Nicht empfohlen, wenn Ihr Datensatz klein ist, da Sie mit jedem zusätzlichen Shard mehr Speicherplatz benötigen und der Leistungsgewinn gering ist.
  • Empfohlen, wenn Ihr Datensatz groß ist und die Verarbeitung Ihrer Abfragen lange dauert, da dedizierte Shards Ihre spezifischen Daten speichern und die Verarbeitung durch Elasticsearch einfacher ist.

Implikationen für jedes Datenmodell als Objekttyp in einem Index:

  • In den 5 Shards eines Index werden mehr Daten gespeichert. Dies bedeutet, dass bei der Abfrage über verschiedene Datenmodelle hinweg weniger Overhead-Probleme auftreten, Ihre Shard-Größe jedoch erheblich größer ist.
  • Es wird länger dauern, bis Elasticsearch mehr Daten in den Shards durchsucht, da mehr Dokumente gefiltert werden müssen.
  • Nicht empfohlen, wenn Sie wissen, dass Sie 1 Terabyte Daten verarbeiten und Ihre Daten in Ihrer Elasticsearch-Zuordnung nicht auf verschiedene Indizes oder mehrere Shards verteilen.
  • Empfohlen für kleine Datenmengen, da Sie keinen Speicherplatz für geringfügige Leistungssteigerungen verschwenden, da jeder Shard Speicherplatz in Ihrer Hardware beansprucht.

Wenn Sie fragen, was sind zu viele Daten im Vergleich zu kleinen Daten? In der Regel hängt dies von der Prozessorgeschwindigkeit und dem RAM Ihrer Hardware, der Datenmenge, die Sie in jeder Variablen in Ihrem Mapping für Elasticsearch speichern, und Ihren Abfrageanforderungen ab. Die Verwendung vieler Facetten in Ihren Abfragen wird Ihre Antwortzeit erheblich verlangsamen. Es gibt keine eindeutige Antwort darauf und Sie müssen einen Benchmark gemäß Ihren Anforderungen erstellen.

Jonathan Moo
quelle
8
Diese Antwort ist nicht komplett ohne die Informationen von elasticsearch.org/guide/en/elasticsearch/guide/current/...
AndreKR
5
Um die ausgezeichnete Antwort zu ergänzen, zitiere ich aus dem ES 5.2-Dokument , das erklärt, warum die Beibehaltung einer großen Anzahl von Shards nicht empfohlen wird: " By default elasticsearch rejects search requests that would query more than 1000 shards. The reason is that such large numbers of shards make the job of the coordinating node very CPU and memory intensive. It is usually a better idea to organize data in such a way that there are fewer larger shards. In case you would like to bypass this limit, which is discouraged, you can update the action.search.shard_count.limit cluster setting to a greater value."
Vergessenheit
48

Obwohl Jonathans Antwort zu dieser Zeit richtig war, hat sich die Welt weiterentwickelt und es scheint nun, dass die Menschen hinter ElasticSearch einen langfristigen Plan haben, die Unterstützung für mehrere Typen einzustellen:

Wohin wir wollen: Wir wollen das Konzept der Typen aus Elasticsearch entfernen und gleichzeitig Eltern / Kind unterstützen.

Wenn Sie für neue Projekte nur einen einzigen Typ pro Index verwenden, wird das eventuelle Upgrade auf ElasticSearch 6.x einfacher.

Danack
quelle
13

Jonathans Antwort ist großartig. Ich möchte nur einige andere Punkte hinzufügen, die zu berücksichtigen sind:

  • Die Anzahl der Shards kann pro ausgewählter Lösung angepasst werden. Sie können einen Index mit 15 primären Shards haben oder ihn für 5 Shards in 3 Indizes aufteilen - die Leistungsperspektive ändert sich nicht (vorausgesetzt, die Daten sind gleichmäßig verteilt).
  • Denken Sie an die Datennutzung. Dh. Wenn Sie Kibana zur Visualisierung verwenden, ist es einfacher, bestimmte Indizes einzuschließen / auszuschließen, aber Typen müssen im Dashboard gefiltert werden
  • Datenaufbewahrung: Verwenden Sie für Anwendungsprotokoll- / Metrikdaten unterschiedliche Indizes, wenn Sie eine andere Aufbewahrungsdauer benötigen
Marcel Matus
quelle
Was versteht man unter Aufbewahrungsfrist? Beziehen Sie sich auf die Zeit zu leben Feld? Dies wird pro Dokument festgelegt.
Kshitiz Sharma
Nein, hier ist die Aufbewahrungsdauer als Aufbewahrung von Dokumenten / Indizes gemeint - wie lange diese Daten gespeichert werden sollen. Basierend auf Datenqualität, Größe, Wichtigkeit - Ich verwende, um unterschiedliche Aufbewahrungsrichtlinien festzulegen. Einige Daten / Indizes werden nach 7 Tagen gelöscht, andere nach 6 W und einige nach 10 Jahren ...
Marcel Matus
2

Beide obigen Antworten sind großartig!

Ich füge ein Beispiel für mehrere Typen in einen Index ein. Angenommen, Sie entwickeln eine App für die Suche nach Büchern in einer Bibliothek. Es gibt nur wenige Fragen an den Bibliotheksinhaber.

Fragen:

  1. Wie viele Bücher planen Sie aufzubewahren?

  2. Welche Art von Büchern werden Sie in der Bibliothek aufbewahren?

  3. Wie wirst du nach Büchern suchen?

Antworten:

  1. Ich plane, 50.000 bis 70.000 Bücher (ungefähr) aufzubewahren.

  2. Ich werde 15 k -20 k technologiebezogene Bücher (Informatik, Maschinenbau, Chemieingenieurwesen usw.), 15 k historische Bücher, 10 k medizinwissenschaftliche Bücher haben. 10 k sprachbezogene Bücher (Englisch, Spanisch usw.)

  3. Suche nach Vorname des Autors, Nachname des Autors, Erscheinungsjahr, Name des Herausgebers. (Dies gibt Ihnen eine Vorstellung davon, welche Informationen Sie im Index speichern sollten.)

Aus den obigen Antworten können wir sagen, dass das Schema in unserem Index ungefähr so ​​aussehen sollte.

// Dies ist nicht die genaue Zuordnung, nur für das Beispiel

            "yearOfPublish":{
                "type": "integer"
            },
            "author":{
                "type": "object",
                "properties": {
                    "firstName":{
                        "type": "string"
                    },
                    "lastName":{
                        "type": "string"
                    }
                }
            },
            "publisherName":{
                "type": "string"
            }
        }

Um dies zu erreichen, können wir einen Index namens Bücher erstellen und verschiedene Typen haben.

Index: Buch

Arten: Wissenschaft, Kunst

(Oder Sie können viele Arten wie Technologie, Medizin, Geschichte, Sprache erstellen, wenn Sie viel mehr Bücher haben)

Wichtig hierbei ist, dass das Schema ähnlich ist, die Daten jedoch nicht identisch sind. Und die andere wichtige Sache sind die Gesamtdaten, die Sie speichern.

Hoffe, dass das oben Genannte hilft, wenn Sie verschiedene Typen in einem Index auswählen. Wenn Sie ein anderes Schema haben, sollten Sie einen anderen Index in Betracht ziehen. Kleiner Index für weniger Daten. Big Index für Big Data :-)

Sourav
quelle