NoSQL oder YesSQL

8

Ich habe ein riesiges Wörterverzeichnis:

%Vor%

Anzahl der Wörter ist wirklich groß.

Nun möchte ich wirklich alle values , auf die von word verwiesen wird, abrufen können. word ist ein Zeichenfolgenwert.

Was sind die besten Werkzeuge? Ich dachte an eine einfache DB-Lösung, aber DBA-Leute sagten, dass es nicht wirklich schnell funktionieren würde.

Also, bevor ich Cormen 's Buch öffne, gibt es einige fertige Lösungen für dieses Problem?

    
David 31.01.2011, 21:06
quelle

5 Antworten

3

In RDMSs (YesSQL) werden Sie höchstwahrscheinlich Werte mit den Operatoren LIKE oder = auf alle Datensätze suchen, d. h. die Suche dauert O (n). Was Sie wirklich brauchen, ist eine Datenstruktur namens invertierten Index , mit der Sie eine Liste von finden können benötigte Werte in O (1). Zur Beschreibung von Struktur und Algorithmen siehe Wikipedia-Artikel, für die Ready-to-Use-Tools weiterlesen.

Es gibt viele Implementierungen des invertierten Index in Suchmaschinen wie Lucene / Solr , Sphinx (was unterstützt übrigens mehrere Datenbanken als Datenquelle) und auch in einigen Schlüssel-Wert-Speichern wie Berkeley DB oder Apache Cassandra . Unterscheidung zwischen Suchmaschinen und Schlüssel-Wert-Speichern ist, dass:

  1. Suchmaschinen implementieren invertierten Index direkter (AFAIK, Schlüssel-Wert DBs verwenden BigTable ) - ähnliche Strukturen, die viel komplexer sind als der invertierte Index selbst.
  2. Suchmaschinen haben eine Vielzahl von Tools zur Textanalyse (Parsing, Stemming) . Ich weiß nicht, ob du es wirklich brauchst, aber wenn du es tust, benutze Suchmaschinen.
  3. Schlüsselwert-DBs sind echte Datenbanken. Das heißt, im Gegensatz zu Suchmaschinen haben sie echte Datentypen, nicht nur Strings . Darüber hinaus können einige solcher DBs (z. B. Berkeley DB) native Datentypen von Programmiersprachen speichern, ohne sie in irgendein inneres Format zu konvertieren. Wenn Sie also eine echte Datenbank mit allen Funktionen benötigen, verwenden Sie Schlüsselwertspeicher.

Beachten Sie auch, dass der invertierte Index eine wirklich einfache Struktur ist, so dass Sie ihn einfach selbst implementieren können, wenn keine der vorherigen Optionen für Sie geeignet ist.

    
ffriend 31.01.2011, 22:57
quelle
5

Betrachten Sie Schlüssel / Wert-Speicher-Engines wie Berkeley DB. Sie sind sehr schnell bei so etwas.

    
Ferruccio 31.01.2011 21:14
quelle
3

Es hängt wirklich davon ab, welches Verhalten du willst. Wenn Sie nur eine exakte Textsuche durchführen wollen, dann ist eine Hash-Tabelle wahrscheinlich eine wirklich gute Idee. Es hat O (1) Lookup erwartet, das ungefähr so ​​schnell ist, wie Sie bekommen werden.

Wenn Sie die Elemente in sortierter Reihenfolge benötigen (z. B. können Sie sie in einer vernünftigen Reihenfolge durchlaufen), dann ist möglicherweise einer der unzähligen ausgeglichenen Suchbäume ein guter Kandidat; zum Beispiel ein rot-schwarzer Baum oder ein AVL-Baum.

Wenn Sie mit einem riesigen Datenbestand arbeiten, der nicht alle in den Hauptspeicher passen kann, dann ist eine B-Baumstruktur eine gute Wahl, bei der es sich um eine Art ausgeglichener binärer Suchbaumstruktur handelt, die die Anzahl der Festplatten minimiert Lesevorgänge erforderlich, um ein bestimmtes Element zu finden. Die meisten Datenbanksysteme verwenden für ihre Suchvorgänge einige B-Bäume.

    
templatetypedef 31.01.2011 21:13
quelle
1

Sie können cassandra (http://cassandra.apache.org/) verwenden. Ist einfach zu starten, hat ziemlich viel Dokumentation und ist eine sehr schnelle Lösung für Ihr Problem.

Hoffe, das hilft,

    
Ron 31.01.2011 22:03
quelle
0

Wenn Sie wissen möchten, dass Sie nur nach Wörtern suchen und nicht umgekehrt, verwenden Sie einen einfachen Schlüsselwertspeicher. Vielleicht Redis wäre am besten.

Wenn Sie der Meinung sind, dass Sie je nach den Werten suchen müssen, benötigen Sie wahrscheinlich Sekundärindizes oder Offline-MapReduce-Jobs. Vielleicht Cassandra wäre am besten.

    
Andrew McKnight 01.02.2011 19:28
quelle