Vor Jahren hab' ich mir mal 'ne Suchmaschine für alle meine Quelltexte geschrieben. Die Dateien liegen halt auf diversen Festplatten rum.
Dazu gibt es nun eine Tabelle Quelltexte: Sie enthält eine eindeutige ID je Quelltext und den vollständigen Pfad zu dem Quelltext.
Dann gibt es eine Tabelle Wörter: Sie enthält alle gefundenen Wörter und eine eindeutige ID für das Wort. (Jedes Wort kommt in dieser Tabelle natürlich nur einmal vor.)
Dann gibt es noch eine Tabelle WortQuelltext: Sie stellt die Verbindung zwischen Quelltexte und Wörter her: Spalten sind WortID und QuelltextID.
Die Tabelle Wörter wird banal und einfach aufgebaut: Alles, was kein Buchstabe ist, wird durch einen Zeilenumbruch ersetzt. Das Ergebnis wird eindeutig sortiert. Groß-/Kleinschreibung wird dabei ignoriert. Jede Zeile enthält nun ein Wort.
Die Wörter werden (soweit nicht schon vorhanden) in die Tabelle Wörter eingefügt. Die Tabelle WortQuelltext wird mit den IDs der Wörter und der ID des Quelltextes befüllt.
Per
SQL geht die Abfrage in etwa so:
SQL-Code:
select Wörter.Wort, Quelletxte.* from Quelletxte, WortQuelltext, Wörter
where Quelltexte.id = WortQuelltext.QuelltextID
and WortQuelltext.WortID = Wörter.id
and Wörter.Wort in ('eins',zwei'drei','ganz','viele',Wörter']
Index auf jede ID und auf die Wörter.
Ist verblüffend schnell und war in 'nem Tag implementiert, kann man analog natürlich auch auf Blob-Spalten, ... anwenden.
Prinzipiell entspricht die Struktur Deinem Vorschlag aus dem Eingangspost.
Soll das Ganze dann noch etwas fehlertoleranter werden, kann man neben den Wörtern auch noch diverse Spalten für SoundEx, phonetische Suchen (wie z. B. Kölner Phonetik), ... in der Tabelle Wörter anlegen. Da kommt es halt dann ein bisserl auf die konkreten Anforderungen an.
Achso: Da das so gut geklappt hat, gibt es das inzwischen auch für alle
HTML-Seiten (wie z. B. ct-Archive von CDs), diverse Tutorials von anno schlagmichtot, Rezepte, ... (egal ob die zu durchsuchenden Texte nun irgendwo auf Datenträgern rumschwirren oder in Datenbanken gesammelt sind). Das Prinzip ist immer das Gleiche und das Schöne daran ist: Die Datenbank ist völlig egal.