2016-05-19 12 views
1

In meinem aktuellen Anwendungsfall verwende ich ElasticSearch als Dokumentenspeicher, über den ich eine facettierte Suchfunktion aufbaue.Kann ElasticSearch nur für Aggregationen verwendet werden?

Der docs Zustand folgend:

Sorting, Aggregationen und der Zugriff auf den Feldwert in Skripten erfordert ein anderes Datenzugriffsmuster.

Doc-Werte sind die Datenstruktur auf der Festplatte, die zur Indexzeit des Dokuments erstellt wurde, wodurch dieses Datenzugriffsmuster möglich wird. Sie speichern die gleichen Werte wie die _source, aber in einer spaltenorientierten Weise, die für die Sortierung und Aggregationen viel effizienter ist.

bedeutet dies, dass die Aggregationen auf dem Index nicht abhängig sind? Wenn ja, ist es ratsam, zu verhindern, dass die Felder insgesamt indiziert werden, indem {"index": "no"} gesetzt wird?

Dies ist eine kleine Abweichung, aber wo ist die Einstellung aktiviert? Wie unterscheidet es sich von index?

Auf eine breitere Anmerkung, sollte ich ElasticSearch verwenden, wenn Aggregationen alles ist, was ich suche? Sollte ich mich für andere Lösungen wie MongoDB entscheiden? Wenn ja, was sind die Leistungsaspekte?

HILFE!

Antwort

2

Es ist definitiv möglich, Elasticsearch zu dem einzigen Zweck zu verwenden, Daten zu aggregieren. Ich habe solche Setups ein paar Mal gesehen. Zum Beispiel würden wir in einem früheren Projekt Daten indexieren, aber wir würden nur Aggregationen ausführen, um Finanzberichte zu erstellen, und wir mussten selten Dokumente/Treffer abrufen. 99% der Anwendungsfälle waren einfach aggregierte Daten.

Wenn Sie einen solchen Anwendungsfall haben, können Sie dann abstimmen können Ihre Zuordnung zu

Die Rolle der enabled ist zu entscheiden, ob Ihre Daten indiziert ist oder nicht. Es ist standardmäßig richtig, aber wenn Sie es auf false setzen, werden Ihre Daten einfach gespeichert (in _source), aber vollständig von den Analysatoren ignoriert, dh es wird nicht analysiert, in Token umgewandelt und indiziert, und somit auch nicht Durchsuchbar, können Sie die _source abrufen, aber nicht danach suchen. Wenn Sie Aggregationen verwenden müssen, muss enabled wahr sein (der Standardwert).

Der Parameter legt fest, ob das Feld gespeichert werden soll oder nicht. Standardmäßig wird der Feldwert indiziert, aber nicht gespeichert, da er bereits mit der _source selbst gespeichert wurde, und Sie können ihn mithilfe der Quellfilterung abrufen. Für Aggregationen spielt dieser Parameter keine Rolle.

Wenn Ihr Anwendungsfall nur über Aggregationen ist, könnten Sie versucht sein, _source: false einzustellen, dh die _source überhaupt nicht zu speichern, da Sie die Feldwerte nur indizieren müssen, um sie zu aggregieren, aber dies ist selten eine gute Idee for various reasons.

Also, um Ihre Hauptfrage zu beantworten, hängen Aggregationen vom Index ab, aber die für Aggregationen verwendeten (doc-) Werte sind in dedizierte Dateien geschrieben, deren innere Struktur viel performanter und optimaler ist als der Zugriff auf die Daten von Index, um Aggregationen zu erstellen.

Wenn Sie ES 1.x verwenden, stellen Sie sicher, dass doc_values für alle Felder, auf die Sie aggregieren möchten, auf true festgelegt wird (außer analysierte Strings und boolesche Felder).

Wenn Sie ES 2.x verwenden, ist doc_values standardmäßig true, Sie müssen also nichts Spezielles tun.

Update:

Es ist erwähnenswert, dass Aggregationen abhängig sind doc_values (dh Per Document Values.dvd und .dvm Lucene-Dateien), die im Wesentlichen wie in dem invertierten Index, der die gleichen Informationen enthält, aber in einer Säulen- organisiert orientierte Mode, die es für Aggregationen viel effizienter macht.

+0

Danke für die Antwort. Aber ich verstehe immer noch nicht, wie Aggregationen vom Index abhängig sind, wenn sie Datenstrukturen auf Laufwerksebene verwenden. – farthVader

+0

Ein Index besteht aus einer Menge von [mehreren Datenstrukturen auf Plattenebene, die in Dateien gespeichert sind] (https://lucene.apache.org/core/5_0_0/core/org/apache/lucene/codecs/lucene50/package-summary .html # Overview) :-) Einige von ihnen werden in den Heap geladen, einige werden in den Dateicache geladen, aber alles (einschließlich Aggregationen) wird letztendlich in einer Datenstruktur gespeichert, die sich in einer oder mehreren Dateien befindet. – Val

+0

Das macht Sinn. Nur um klar zu sein, Aggregationen sind abhängig von dem Vorwärtsindex, im Gegensatz zum invertierten Index - der für die Suche ist. Aber beide Arten von Indizes existieren innerhalb des Segmentindex. Hört sich richtig an? – farthVader

Verwandte Themen