Kombination von Neo4j und Elasticsearch

8

Ich verwende Neo4j als meine primäre Datenbank. Es ist eine nette Grafikdatenbank, die mir sehr gute Kontrolle über Verbindungen zwischen Knoten gibt. Bei der Suche nach Volltext (Suchfunktion auf einer Website) scheint es jedoch zu fehlen. Daher denke ich darüber nach, Elasticsearch zum Erstellen der Suchfunktion in meiner Anwendung zu verwenden. Aber dabei gibt es nur wenige Probleme. Nehmen wir an, wir suchen nach Benutzerbeiträgen. In neo4j können Beiträge das folgende Modell haben.

%Vor%

Schön an Neo4j zu sein (sagen wir mal, wenn man Beiträge in einem Benutzerprofil bekommt) ist, dass man all das auf einmal greifen kann (auch Profilbild und Benutzerdetails, wenn man schon dabei ist und der Beitrag schon gefallen hat). Das ist eine Menge Details in einer Abfrage (Chiffrierbefehl). Wenn wir nun die Elasticsearch-Ausgabe mit dem gleichen Detaillierungsgrad versehen wollen, kann ich mir im Moment Folgendes vorstellen:

  1. Speichern Sie alles in Neo4j und Elasticsearch. Wenn ein Text durchsucht wird, listet die Ergebnisse von elasticsearch auf. Aber es gibt immer noch Probleme wie das Erhalten, wenn der Benutzer den Beitrag schon gemocht hat (das könnte neo für jeden Beitrag noch einmal fragen? Das klingt nicht so nett)

  2. Speichern Sie die Post-ID in Elasticsearch. Wenn Sie Suchergebnisse durchsuchen, erfassen Sie Informationen zu jedem Post aus der neo4j-Datenbank mit dieser Post-ID und zeigen die Ergebnisse an. (10 Ergebnisse - & gt; 10 separate Anrufe, klingt wieder sehr ineffizient)

  3. Holen Sie sich eine Liste der von Elasticsearch bereitgestellten IDs und machen Sie einen Aufruf an neo4j und holen Sie sich die Ergebnisse (weiß nicht, wie das geht oder ob es Leistungsprobleme gibt). Eine Referenznummer könnte hilfreich sein.

Irgendwelche Lösungen außer diesen? Diese klingen ein wenig ineffizient.

    
pewpewlasers 22.01.2015, 17:26
quelle

2 Antworten

7

Dies ist ein bisschen eine meinungsbasierte Frage, weil es keine "richtige" Antwort gibt, also bereitet euch darauf vor, dass der SO-no-fun-Hammer zusammenbricht ... aber ich habe mir das gedacht - Zwei (Elasticsearch, dann Neo) Punch ist der beste Weg, dies zu handhaben: Indexeigenschaften in Elasticsearch, führen Sie eine Volltextsuche durch, um mögliche IDs zu erhalten, und erstellen Sie dann eine Cypher-Übereinstimmung, die Ergebnisse auf zurückgegebene IDs beschränkt.

In Cypher können Sie IN [] verwenden, um Datensätze zurückzugeben, die innerhalb eines Arrays übereinstimmen. Also könntest du MATCH (u:Student { age: 30 }) WHERE ID(u) IN [1, 2, 3, 4] RETURN u machen. Der Trick bei der Integration von Elasticsearch mit Neo besteht also darin, Cypher-Abfragen um ES-Ergebnisse herum zu erstellen. Ich habe wirklich keine Tipps dazu, weil es von deiner Sprache und deinem Fahrer abhängt.

In Neo4j.rb denke ich darüber nach zu versuchen, dies zu automatisieren, so dass Sie dies tun können:

%Vor%

... und es wird wissen, dass das Lesson-Modell Elasticsearch verwendet, die Abfrage ausführt und dann die Abfrage für den Benutzer so ändert, dass es effektiv Folgendes ist:

%Vor%

Ich habe Searchkick für die Volltextsuche mit Neo verwendet und es läuft gut. Ich denke, das ist machbar. Nicht eine Lösung für dein Problem, aber es ist, wie ich darüber nachdenke, also vielleicht gibt es dir ein paar Ideen.

Es ist erwähnenswert, dass Neo Fuzzy-Suche mit =~ hat, es verwendet einfach keine Indizes, so dass es einen Leistungseinbruch geben kann. Dies ist jedoch möglicherweise kein Problem, da Sie die Anzahl der Knoten und Eigenschaften filtern können, die Cypher untersuchen muss, indem Sie weitere Informationen zu anderen Teilen Ihrer Abfrage hinzufügen. Sie sollten einige Benchmarks mit Ihren Daten durchführen, um herauszufinden, ob der zusätzliche Aufwand von Elasticsearch und kompliziertere Abfragen notwendig sind.

    
subvertallchris 22.01.2015, 18:26
quelle
3

Ich suche auch nach Neo4J & amp; ElasticSearch-Integration. Ich habe "Neo4j River Plugin für ElasticSearch" gesehen. Aber ich weiß nicht, wie ich es benutzen soll. Wenn ihr Informationen zur Integration mit "Neo4j River Plugin für ElasticSearch" findet, lasst es mich bitte wissen, es wird sehr hilfreich sein.

    
RCS 05.02.2015 07:51
quelle

Tags und Links