Lucene in Neo4j hat einige Fehler in Bezug auf zuverlässige Suchanfragen - im Vergleich zu OrientDB

Ich bin noch in der bewertung von Neo4j vs. OrientDB. Vor allem brauche ich Lucene als Volltext-Index-Engine. Also habe ich auf beiden Datenbanken das gleiche Schema mit den gleichen Daten erstellt (300Mio Zeilen). Ich habe auch Erfahrung mit der Abfrage verschiedener Dinge in beiden Systemen. Ich habe den Standard Analyzer auf beiden Seiten verwendet. Die Ergebnisse der OrientDB-Testabfragen sind alle gut und in Bezug auf Zuverlässigkeit und Geschwindigkeit wirklich gut. Die Geschwindigkeit von Neo4j ist auch in Ordnung, aber die Ergebnisse sind in den meisten Fällen irgendwie schlecht. Kommen wir also zu den verschiedenen Problemen, die ich mit der Neo4j Lucene-Indizierung habe. Ich gebe Ihnen immer ein Beispiel, wie es in OrientDB aussehen würde und welche Ergebnismenge Sie aus der Abfrage herausholen sollten.

Also gibt es in diesen Beispielen Anwendungen mit Titeln. Die Titel sind in beiden Datenbanken mit Lucene indiziert. Applns haben auch einen Ausweis, um die Bestellung zu demonstrieren. Am Ende jeder Abfrage habe ich einFrage über sie. Es wäre toll, ein paar @ zu bekommFeedbac oder auch answers über sie

Query # 0: Ein-Wort-Abfrage ohne Reihenfolge

Nun diese Abfrage ist sehr einfach. Es soll getestet werden, wie sich die Datenbank verhält, wenn es nur ein einfaches Wort und nichts anderes gibt. Wie Sie sehen, ist das Neo4j-Ergebnis viel länger als das von OrientDB. OrientDB verwendet TFIDF, um die Ergebnisse kurz und verlässlicher für die eigentliche Suche zu halten. Wie Sie als erstes Ergebnis in OrientDB sehen können, gibt es Titel mit SOLAR. Das fehlt auch in Neo4j völlig.

In Neo4j:START n = Knoten: Titel ('Titel: Solar') RETURN n.Titel, n.ID LIMIT 10

SOLARSTRAHLUNGSSCHIRM-PARTIKEL UND SOLARSTRAHLUNGSSCHIRM-HARZ-MATERIAL, VERTEILT MIT ... 38321319

Solar-Modul zur Kühlung von Solarzellen an der Unterseite eines Solarmoduls mit Luftein- und -austrittsöffnungen ... 12944121

olarbauelement für Solarthermieanlagen, Solarthermieanlage, Verfahren zum Betreiben einer Solarthermieanlage 3241461

...

In OrientDB:WÄHLEN Sie Titel, ID VON ANWENDUNG, WO Titel LUCENE "Solar" LIMIT 10

SOLAR 24900187

Solareinheit und Solarapparat 1876343

Solar Modul mit Solarkonzentrator 13496706

...

Fragen

Warum verwendet Neo4j kein TFIDF oder was verwenden sie stattdessen?Ist Neo4j in der Lage, eine Sortierung der Keyword-Übereinstimmung zu verwenden?Ist es möglich, TFIDF in OrientDB zu einem anderen Namen zu ändern?Query # 1: Ein-Wort-Abfrage mit Reihenfolge nach ID

Neo4j bestellt die IDs, bevor TFIDF verwendet wird. Wie aus Abfrage Nr. 0 bekannt, verwendet Neo4j TFIDF nicht. Es wird also im Grunde nur über die ersten Ergebnisse der Lucene-Abfrage gesucht. In OrientDB wird außerdem noch nach guten TFIDFs gesucht und dann bestellt.

In Neo4j:START n = Knoten: Titel ('Titel: Solar') RETURN n.Titel, n.ID ORDER BY n.ID ASC LIMIT 10

Stapelbarer Flachdach- / Bodenrahmen für Sonnenkollektoren 318

Verfahren zur Herstellung eines Kontakts für Solarzellen 636

olarzelle und Herstellungsverfahren dafür 12

...

In OrientDB:Titel AUSWÄHLEN, ID VON ANWENDUNGSORT Titel LUCENE "Solar" BESTELLEN NACH ID ASC GRENZE 10

Solareinheit und Solarapparat 1876343

Solar Modul mit Solarkonzentrator 13496706

SOLAR TRACKER FÜR SONNENSAMMLER 16543688

...

Fragen

Wie eine Suche in OrientDB aussehen würde, sollte nach der ID sortiert sein und dennoch mit der besten TFIDF übereinstimmen. Gibt es in Neo4j eine Möglichkeit, das Lucene-Match vor der Bestellung über die ID zu bestellen?Query # 2: Ein Wort mit einer Sternensuche

ie @Star-Suche hatte keinen Einfluss auf die Neo4j-Ergebnisse. Die Ergebnisse von OrientDB haben sich auf gute Weise geändert.

In Neo4j:START n = Knoten: Titel ('Titel: Solar *') RETURN n.Titel, n.ID ORDER BY n.ID ASC LIMIT 10

Stapelbarer Flachdach- / Bodenrahmen für Sonnenkollektoren 318

Verfahren zur Herstellung eines Kontakts für Solarzellen 636

olarzelle und Herstellungsverfahren dafür 12

...

In OrientDB:Titel AUSWÄHLEN, ID VON ANWENDUNGSORT Titel LUCENE "solar *" BESTELLEN NACH ID ASC GRENZE 10

Hochleistungs-Solarmethangenerator 8354701

Vollkunststoffwaben-Solarwarmwasserbereiter 8355379

Plattentyp Solarenergie-Wärmekollektorplattenkern und Herstellungsverfahren 8356173

...

Fragen

Ignoriert Neo4j Sternsuchen?Query # 3: Suche nach 2 durch ein Leerzeichen getrennten Wörtern

Das seltsame hier ist, dass Sie "Titel: Solarpanel" auf diese Abfrage hier ändern müssen. Ansonsten bekommst du nur Fehler. OrientDB scheint bisher gut zu sein.

In Neo4j:START n = Knoten: Titel (Titel = "Solarpanel") RETURN n.Titel, n.ID ORDER BY n.ID ASC LIMIT 10

Returned 0 Zeilen in 817 ms

In OrientDB:Titel AUSWÄHLEN, ID VON ANWENDUNGSORT Titel LUCENE "Solarpanel" BESTELLEN NACH ID ASC GRENZE 10

SOLAR PANEL 1584567

SOLAR PANEL 1616547

SOLAR PANEL 2078382

SOLAR PANEL 2078383

Solarpanel 2178466

...

Fragen

Warum braucht Neo4j hier eine spezielle Abfrage, um zumindest keinen Fehler zu werfen? Warum schlägt die Abfrage fehl und gibt nichts zurück? Ich weiß, dass Neo4j hier nach Kleinbuchstaben sucht, daher wird zwischen Groß- und Kleinschreibung unterschieden. Aber warum ist es so? Ich meine, ich verwende den Standardanalysator und das Dokument von Neo4j Lucene sagt, dass es wahr ist, also bedeutet es to_lower_letter.Query # 4: Jetzt wird nach der gleichen Abfrage in Großbuchstaben gesucht

Das gleiche Problem wie in # 3. In Neo4j werden bei der Suche nur die Großbuchstaben der Wörter zurückgegeben. Die Ergebnisse von OrientDB sehen wieder gut aus.

In Neo4j:START n = Knoten: Titel (Titel = "SOLAR PANEL") RETURN n.Titel, n.ID ORDER BY n.ID ASC LIMIT 10

SOLAR PANEL 348800

SOLAR PANEL 420683

SOLAR PANEL 1393804

SOLAR PANEL 1584567

SOLAR PANEL 1616547

...

In OrientDB: SELECT title, ID FROM Appln WHERE title LUCENE "SOLAR PANEL" ORDER BY ID ASC LIMIT 10

SOLAR PANEL 1584567

SOLAR PANEL 1616547

SOLAR PANEL 2078382

SOLAR PANEL 2078383

Solarpanel 2178466

...

Fragen

Dieselbe Frage wie in # 3, wie man mit to_lower_letter sucht?Query # 5: Kombinieren von zwei Wörtern und Verwenden der Sternensuche

Hier möchte ich die Wortsuche mit der Sternensuche kombinieren. Aber mit der gleichen Suche kann ich keine Übereinstimmungen finden, weil er den Stern als übliches Zeichen im Titel erwartet. "Title: SOLAR PANEL *" kann ich aber nicht sagen. Das ist auch verboten. In OrientDB ist alles in Ordnung.

In Neo4j:START n = Knoten: Titel (title = "SOLAR PANEL *") RETURN n.Titel, n.ID ORDER BY n.ID ASC LIMIT 10

Returned 0 Zeilen in 895 ms

In OrientDB:Titel AUSWÄHLEN, ID VON ANWENDUNGSORT Titel LUCENE "SOLAR PANEL *" BESTELLEN NACH ID ASC LIMIT 10

SOLAR PANELS 1405717

SOLAR PANEL 1584567

SOLAR PANEL 1616547

SOLAR PANEL 2705081

Solar Panel 2766555

...

Fragen

Wie können Sie einige Wörter mit der Sternensuche in Neo4j kombinieren?Query # 6: Abfrageergebnisse zählen

Das Letzte, was ich wirklich brauche, ist eine schnelle Suche, wie viele Ergebnisse es insgesamt gibt. Hier findet Neo4j ein Ergebnis viel schneller, findet aber immer weniger Übereinstimmungen als OrientDB. Die Suche nach Solar ist ziemlich nah beieinander. Aber ein anderer Test war nicht so nah.

In Neo4j:START n = Knoten: Titel ("Titel: Solar") RETURN count (*)

143211 in 220 Sek.

In OrientDB:SELECT count (*) title FROM Appln WHERE title LUCENE "Solar" LIMIT -1

148029 in 50 Sek.

Fragen

Wie können die Suchzeiten auf beiden Systemen verbessert werden?Warum finden beide Systeme unterschiedliche Übereinstimmungen? Kommt auch bei anderen Stichwörtern vor. Vielleicht andere Indexierung eninge verwendet?

Nun das ist erstmal alles. Wenn Sie eine andere Anfrage benötigen, teilen Sie es mir einfach mit und ich übermittle sie. Ich denke, es ist sehr wichtig, die Lucene-Implementierung zu vergleichen, da Lucene mit Millionen von Knoten viele Vorteile hat. Danke für jeden kleinen Tipp.

Btw: Bitte geben Sie keine Tipps zur Verwendung von Java-Code für die Abfrage. Ich möchte Cypher verwenden, da die Anforderung im Browser wie in OrientDB erfolgen soll. Ich weiß, dass alles hier leicht mit Java-Code gemacht werden kann. Vielen Dank

Antworten auf die Frage(1)

Ihre Antwort auf die Frage