phpbar.de logo

Mailinglisten-Archive

AW: MySql FullText

AW: MySql FullText

Hans-Jürgen Schwarzer hjs@schwarzer.de
Wed Dec 18 08:53:08 2002


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