2013-10-22 2 views
7

Was ist der beste Weg, um das Äquivalent eines SQL-Joins in Elasticsearch zu tun?Wie macht man einen Beitritt in Elasticsearch - oder auf der Lucene-Ebene

Ich habe ein SQL-Setup mit zwei großen Tabellen: Personen und Elemente. Eine Person kann viele Elemente besitzen. Sowohl die Personen- als auch die Positionszeile können sich ändern (d. H. Aktualisiert werden). Ich muss Suchen ausführen, die nach Aspekten sowohl der Person als auch des Elements filtern.

In Elasticsearch, sieht es so aus, als könnten Sie Person ein verschachteltes Dokument von Item machen, dann benutzen Sie .

Aber: wenn Sie dann eine Person aktualisieren, denke ich, dass Sie jedes Einzelteil aktualisieren müssen, das sie besitzen (das könnte eine Menge sein).

Ist das korrekt? Gibt es eine schöne Möglichkeit, diese Abfrage in Elasticsearch zu lösen?

+3

Nur ein kleines Problem mit der Terminologie: Wenn Sie das 'has_child' verwenden, wäre die Person ein untergeordnetes Dokument, kein verschachteltes Dokument (Eltern/Kind oder verschachtelte Dokumente). – javanna

+0

können wir den ElasticSearch Hive Connector verwenden, um eine JOIN-Operation von Hive auf ElasticSearch Data Store auszuführen? - https://github.com/elastic/elasticsearch-hadoop – sumanth232

Antwort

13

Wie bereits erwähnt, ist der Weg zu Eltern/Kind. Der Punkt ist, dass verschachtelte Dokumente extrem performant sind, aber damit sie aktualisiert werden können, müssen Sie die gesamte Struktur (Eltern + verschachtelte Dokumente) erneut einreichen. Obwohl die interne Implementierung verschachtelter Dokumente aus separaten Lucene-Dokumenten besteht, sind diese verschachtelten Dokumente weder sichtbar noch direkt zugänglich. Wenn Sie verschachtelte Dokumente verwenden, müssen Sie in der Tat richtige Abfragen verwenden, um auf sie zuzugreifen (verschachtelte Abfrage, verschachtelter Filter, verschachtelte Facette usw.).

Auf der anderen Seite Eltern/Kind ermöglicht Ihnen separate Dokumente, die sich aufeinander beziehen, die unabhängig voneinander aktualisiert werden können. Es hat Kosten in Bezug auf Leistung und Speicherbedarf, ist aber viel flexibler als verschachtelte Dokumente.

Wie bereits in this article erwähnt, bedeutet die Tatsache, dass elasticsearch Ihnen hilft, Beziehungen zu verwalten, nicht, dass Sie diese Funktionen verwenden müssen. In vielen komplexen Anwendungsfällen ist es besser, eine benutzerdefinierte Logik auf der Anwendungsebene zu haben, die mit Beziehungen umgehen kann. In der Facette gibt es auch Einschränkungen bei Eltern/Kind: zum Beispiel können Sie niemals Eltern und Kinder gleichzeitig zurückbekommen, im Gegensatz zu verschachtelten Dokumenten, die es nicht erlauben, nur passende Kinder zurück zu bekommen (vorerst).

+1

+1 für den Artikel zu erhalten, auf den Sie verwiesen haben. Ich hatte das vorher nicht gesehen und es gibt eine großartige Zusammenfassung der Punkte. – Phil

+0

können wir den ElasticSearch Hive Connector verwenden, um eine JOIN-Operation von Hive auf ElasticSearch Data Store auszuführen? - https://github.com/elastic/elasticsearch-hadoop – sumanth232

2

Werfen Sie einen Blick auf meine Antwort: In Elasticsearch, can multiple top-level documents share a single nested document?

Das diskutiert die Verwendung von _parent Mapping als eine Möglichkeit, um das Problem zu vermeiden, um jeden Punkt zu aktualisieren, wenn eine Person aktualisiert wird.

+0

können wir ElasticSearch Hive Connector verwenden, um eine JOIN-Operation von Hive auf ElasticSearch Data Store zu tun? - https://github.com/elastic/elasticsearch-hadoop – sumanth232

+0

@ krishna222 ist es wahrscheinlich wert, eine neue Frage zu stellen, um eine Antwort bezüglich des Hive-Konnektors – Phil