Mailinglisten-Archive |
Hallo Norbert, erstmal freut es mich, daß meine Idee Dein Interesse geweckt hat. Nun, die Lösung, die ich vorschlagen würde läuft in Schritten ab: 1. Einrichtung der Hilfstabellen: create table tblWort ( nWortID int, strWort varchar2(200), index idxWortWortID (nWortID), index idxWortWort (strWort) ) create table tblWortText ( nWortID int, nTextID int, index idxWortTextWortID ( nWortID ) ) alter table texte add column nTextID alter table texte add index idxTexteWortID ( nWortID ) Als nächstes würde ich die Tabelle TEXTE mit IDs versorgen. Nächster Schritte wäre die vollständige Verarbeitung der Tabelle TEXTE, indem alle Spalteninhalte in ZITAT in Worte zerlegt werden würden. Jedes Wort registriere ich in Tabelle tblWort und trage einen Verweis auf Wort und Text (nWortID und nTextID) in der Tabelle tblWortText ein. Wichtig: Jedes Wort wird nur EINMAL in der Tabelle tblWort gespeichert. Die Zuordnung zu den Texten erfolgt über die Tabelle tblWortText. Dort stehen dann für zb. das Wort "Rasenmäher" mit der ID 4599 drei Einträge für die Zitate 12365, 54322 und 992773 in denen das Wort Rasenmäher vorkommt. Jetzt ist das System marschbereit... Eine Anfrage á la finde 'in ich um den schlaf gebra' würde ich in SQL umsetzen: SELECT nTextID, autor, thema, zitat FROM texte, tblWortText, tblWort WHERE ( tblWort.strWort like '%in%' or tblWort.strWort like '%ich%' or tblWort.strWort like '%um%' or tblWort.strWort like '%den%' or tblWort.strWort like '%schlaf%' or tblWort.strWort like '%gebra%' ) AND tblWort.nWortID = tblWortText.nWortID AND tblWortText.nTextID = texte.nTextID Davon ausgehen, daß a) der like-Vergleich case-insensitiv ist b) daß zuerst die tblWort gescant wird, dann mit tblWortText gejoint, dann mit texte gejoint wird. Dieses Verfahren erfordert natürlich das zerlegen des Suchstrings und der Zitate in Worte /Teilstrings. Allerdings: Die Zitate werden nur EINMAL zerlegt und gespeichert. Der Abruf erfolgt mit hoher Wahrscheinlichkeit ÖFTERS. Und da die Aufbereitung des SQL-Statements auf Skriptseite passiert kann man das Terlegen recht gut handeln. Zusatznutzen: Man kann auch den Autor und das Thema mit in die Verzeigerung aufnehmen, sodaß beide in die Suche integriert sind ... Mögliche Ergänzung: Man könnte in der Tabelle tblWort einen Counter mitlaufen lassen, wenn die Texte verzeigert werden. Bei einer Suche könnte man alle Worte ausschließen, die zu häufig vorkommen. Etwa in mehr als 50 % aller Texte. Der Vorteil des Verfahrens mit der Worttabelle ist: Je mehr Zitate Du in Deiner TEXTE-Tabelle speicherst, um so schneller wird im Gegensatz dazu die tblWort durchpflügt werden, da diese WESENTLICH weniger Einträge aufweist als die TEXTE-Tabelle. Nämlich nur je einen Eintrag pro Wort. Wie denkst Du darüber ? Beste Grüße, Hans-Jürgen P.S.: Falls ich die mySQL-Syntax nicht korrekt wiedergegeben habe bitte ich dieses zu entschuldigen. Ich schlage mir gerade Oracle und MS_SQL-Server um die Ohren. Ich habe auch keine Constraints eingefügt. Und ich habe auch keinen testrun gemacht. Dies ist das Konzept, nicht die Implementierung. ;-) -- Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter -->> http://www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive