Was ist die effizienteste Datenindizierungstechnik?

10

Wie wir alle wissen, gibt es einige Datenindizierungstechniken, die von bekannten Indizierungs-Apps verwendet werden, wie Lucene (für Java) oder Lucene.NET (für .NET), MurMurHash, B + Tree usw. Für ein No-Sql / Objekt Orientierte Datenbank (die ich versuche, ein wenig mit C # zu schreiben / herumzuspielen), welche Technik schlagen Sie vor?

Ich habe über MurMurhash-2 gelesen und speziell v3-Kommentare sagen, dass Murmeln sehr schnell ist. Auch Lucene.Net hat gute Kommentare dazu. Aber was ist mit ihren Erinnerungsspuren im Allgemeinen? Gibt es eine effiziente Lösung, die weniger Platz benötigt (und natürlich, wenn schneller vorzuziehen ist) als Lucene oder Murmeln? Oder sollte ich eine spezielle Indexstruktur schreiben, um die besten Ergebnisse zu erzielen?

Wenn ich versuche, meine eigenen zu schreiben, gibt es dann eine akzeptierte Skala für eine gute Indizierung, etwa 1% des Datenknotens oder 5% des Datenknotens? Jeder nützliche Hinweis wird geschätzt.

sihirbazzz
quelle

Antworten:

10

Ich denke, Sie haben einige Dinge in Ihrer Frage durcheinander gebracht. Lucene (ich weiß nichts über Lucene, NET, aber ich nehme an, es ist dasselbe) ist eine Bibliothek, die zum Analysieren, Aufteilen in Token und Speichern von Dokumenten verwendet wird, um sie später abfragen und abrufen zu können. Lucene hat ein ziemlich altes, aber effektives Modell. Es verwendet umgekehrte Bäume, um Dokumente zu finden und abzurufen. Ohne weitere Details werden alle Dokumente in Token (Begriffe) aufgeteilt, und für jeden Begriff wird eine Datenstruktur gepflegt, in der alle Dokumente gespeichert sind, die den angegebenen Begriff enthalten. Da eine Datenstruktur als BTree, Hash-Tabelle und in den neuesten Hauptrevisionen verwendet werden kann, können Sie sogar Ihre eigenen Datenstrukturen einbinden.

Ein BTree (siehe Wikipedia-Seite für weitere Details) ist eine Art Baumdatenstruktur , die für die Arbeit mit großen Datenblöcken geeignet ist und häufig zum Speichern von baumartig geordneten Strukturen auf der Festplatte verwendet wird. Für In-Memory-Speicher sind andere Bäume besser geeignet.

Murmur-Hash (siehe Wikipedia-Seite für weitere Details) ist eine Familie von Hash-Funktionen, die in der Hash-Tabelle verwendet werden. Die Implementierung der Hash-Tabelle ist nicht wichtig. Es kann sich um eine verkettete Standardimplementierung oder ein erweitertes offenes Hash-Adressierungsschema handeln. Die Idee ist, dass die Hash-Tabellen es einem ermöglichen, schnell einen Schlüssel aus einem ungeordneten Schlüsselsatz zu erhalten und auf Aufgaben wie: Ist dieser Schlüssel Teil dieses Schlüsselsatzes zu antworten? Welchen Wert hat dieser Schlüssel?

Nun zurück zu Ihrem Hauptproblem. Sie haben eine Bibliothek (Lucene) und für Datenstrukturen werden beide Datenstrukturen in Lucene verwendet. Jetzt sehen Sie, dass es nicht möglich ist, Ihre Frage in diesen Begriffen zu beantworten, da sie nicht vergleichbar sind.

In Bezug auf Ihren Platzbedarf und Ihre Leistung ist dies jedoch ein Teil der Frage. Zunächst müssen Sie wissen, welche Art von Operationen Sie implementieren müssen.

Benötigen Sie nur einen Wert für den Schlüssel oder müssen Sie alle Elemente in einem Bereich finden? Mit anderen Worten, brauchen Sie Ordnung oder nicht? Wenn Sie dies tun, kann ein Baum helfen. Wenn Sie dies nicht tun, kann stattdessen eine schnellere Hash-Tabelle verwendet werden.

Haben Sie viele Daten, die nicht in den Speicher passen? Wenn ja, würde eine festplattenbasierte Lösung helfen (wie BTree). Wenn Ihre Daten in den Speicher passen, verwenden Sie die schnellste In-Memory-Lösung und verwenden Sie die Festplatte nur als Speicher (mit einer anderen Struktur, viel einfacher).

Rapaio
quelle
Vielen Dank Rapaio :) Die Punkte, die Sie mir gegeben haben, sind sehr nützlich und werden klarer. Da ich ein .NET-Entwickler bin und neugierig auf C (ich fange an zu lernen) und neue, schnelle, zuverlässige, skalierbare und skalierbare Elemente Natürlich voll kontrollierbar - kurzfristig: sehr aufgeregte - Techniken. Also muss ich sehr viel lernen. Um zu lernen, versuche ich so viele Dokumente zu lesen, aber wie Sie sich vorstellen können, bin ich am Anfang. Ich wusste nicht, dass BTree Vorteile auf der Festplatte hat (In der .Net-Welt erklären es so viele Autoren wie folgt: Eine hierarchische Datenstruktur wie Linked-List..No More!) Nochmals vielen Dank
sihirbazzz
Und wenn Sie mir erlauben, bis es eine Erklärung / Antwort von höherer Qualität als Ihre gibt, möchte ich dies als Antwort akzeptieren. Und übrigens, Lucene.NET ist eine .NET-Implementierung von Javas Lucene
sihirbazzz