Die kurze Antwort lautet, dass das Abrufen von Text fast nichts mit dem Design und der Verwendung traditioneller Datenbanken zu tun hat . Jemand, der ein Ass beim Erstellen / Verwenden eines RDBMS ist, ist wie ein Lamm zum Schlachten, wenn er sich zum ersten Mal dem Abrufen von Text nähert.
(Entschuldigung für die lange Antwort, aber ich bin heute krank im Bett und habe nichts anderes zu tun.)
Im Folgenden könnte leicht kommen unter TL; DR, aber wenn Sie die Zeit und das Interesse haben, was folgt , ist ein Stück der längeren Antwort. Hinweis: Ich spreche von der Implementierung eines kommerziellen Informationsabrufsystems ab 1986. Wir waren ein technischer Erfolg, aber ein Marketing-Flop.
Um IR (Information Retrieval) ordnungsgemäß ausführen zu können, müssen Sie zunächst überlegen, wonach Sie suchen und wie Sie es mithilfe Ihres Abfragemechanismus finden. Das mag einfach klingen, ist aber alles andere als einfach. Hier sind nur einige der Dinge, die Sie entscheiden müssen, bevor Sie überhaupt mit dem Scannen Ihrer Dokumente (oder Felder) beginnen.
- Ist der Fall wichtig? Ist DoD dasselbe wie Dod? Wie wäre es mit "Flamme" und "FLAMME" (ein Köln basierend auf dem Burger King Whopper (ja, wirklich)).
- Welche Arten von Token werden Sie indizieren? Sie möchten offensichtlich "Papa" indizieren. Sie möchten wahrscheinlich "daddy123" indizieren. Möchten Sie "123" indizieren? "12.3"? "192.168.1.1"?
- Wie gehen Sie mit Dingen wie Silbentrennung um? Ein etwas veraltetes Beispiel sind "Datenbank", "Datenbank" und "Datenbank", die alle 1986 gleichzeitig verwendet wurden.
- Wie bestimmen Sie Satzumbrüche, wenn Ihre Abfragesprache das Konzept "A im selben Satz wie B finden" unterstützt? Obwohl '?' und '!' sind einfach genug, die sind eine Schlampe. Denken Sie an Dinge wie "Mr.", "2.", "etc." usw.
- Wirst du das Stemming unterstützen? Wenn ja, wie vorsichtig werden Sie sein, um den POS (Part Of Speech) nicht versehentlich zu ändern? ZB können "Katzen" zu "Katze" stammen, aber "Jalousien" können zu "Blind" gehören oder nicht. Wenn es ein Verb war ("Er macht mich blind"), dann können Sie stammen, aber wenn es ein Substantiv war ("Ich mag Ihre Jalousien), können Sie nicht (oder sollten es zumindest nicht). Stemming ist sehr verführerisch, aber es ist ist ein Sumpf der Ersten Ordnung.
- Welche Sprachen werden Sie unterstützen? Was auf Englisch funktioniert, kann auf Französisch oder Deutsch sehr scheitern, obwohl es seltsamerweise für Japaner in der Hepburn Romanji- Darstellung in Ordnung ist .
Und die Liste geht weiter und weiter.
Dann müssen wir über unsere Abfragesprache nachdenken. Es mag den Anschein haben, dass wenn alles, was Sie unterstützen wollen, ein einfacher Boolescher Wert ist, es einfach sein sollte, aber das eine, worüber man sich allgemein einig ist, ist, dass der reine Boolesche Wert für Text scheiße ist . Zum Beispiel benötigen Sie zusätzliche Operatoren, um die Reihenfolge und die Nähe festzulegen, und Junge, oh, Junge macht das Leben jemals komplizierter. Sie müssen auch wissen, in welchem Bereich Sie sich befinden - Titel, Kopfzeile, Text usw. -, was zu allerlei sammlungsspezifischem Parsing-Spaß führt. Aber jetzt reicht es nicht mehr aus, nur eine Liste der Token im Dokument zu haben. Sie müssen wissen, woim doc kommen sie vor. Dies führt zu einem Adresstupel von (docID, sectionID, para-in-section, Satz-in-para, Wort-in-Satz). Das effiziente Speichern und Durchsuchen dieser Informationen kann für eine Nicht-Spielzeug-Sammlung schwierig werden.
Dann gibt es die tatsächliche Struktur Ihres Datenspeichers. Textsysteme werden normalerweise als "vollständige Inversion" der Dokumente implementiert. Wie viele Indizes hat die durchschnittliche DB? 10? 50? 500? Im IR ist es nicht ungewöhnlich, 5.000.000 oder mehr Indizes zu haben, einen für jedes einzelne Token. Und jedes gegebene Token kann 1 Instanz (z. B. "Narfle" oder "Garthok") oder 10.000.000 Instanzen (z. B. "The") haben. Dies bedeutet, dass Ihre gesamte Methode zum Erstellen und Aktualisieren von Indizes blitzschnell sein muss, sonst sinken Sie in den Sumpf. Und Sie haben noch viele andere Probleme, die eine herkömmliche Datenbank hat: Speicherplatzverwaltung, Wiederherstellung nach einem Absturz, kohärenter Snapshot von einem laufenden System usw. usw.
Endlich gibt es ein Ergebnisranking. Eine nicht eingestufte Ergebnismenge aus einer Booleschen Abfrage für eine große Sammlung ist für einen Menschen nutzlos. Es mag für ein Programm nützlich sein, aber damit habe ich mich nicht befasst. Obwohl unser System Boolean implementiert hat, war unser Verkaufsargument, dass wir das erste im Handel erhältliche System waren, das die Ähnlichkeitssuche basierend auf dem Kosinuskoeffizienten unterstützte . Die Mathematik und Logik dieser Art der Suche (im Grunde ein normalisiertes Punktprodukt des Abfragevektors gegen Millionen von Dokumentvektoren) erforderte radikal andere Ansätze für die Darstellung und Speicherung von Daten als Boolean - definitiv nichts, was in Ihrer durchschnittlichen Datenbank verfügbar ist.
All dies (und mehr) ist der Grund, warum "Textabruf" und "Datenbank" fast nicht zum selben Satz gehören. Ich denke, Sie sollten besser eine gute Datenbank für Ihre "normalen" Anforderungen auswählen und dann ein externes IR-System verwenden, um die "Dokumente" in Ihrer primären Datenbank zu indizieren / zu durchsuchen.