Home
SQL / MySQL
Datenbanken?
  ---------------
Select
Insert
Update
Delete
  ---------------
Where
Order By
Group By
  ---------------
Create Table
Alter Table
Rename Table
Drop Table
Optimize Table
Repair Table
Backup Table
Restore Table
Show Tables
Describe Table
  ---------------
Use DB
Create DB
Drop DB
Show DBs
  ---------------
Funktionen
Indizes
Fulltext
Feldtypen
Gästebuch
Download
Kontakt
 
57973 Seitenaufrufe

FULLTEXT - Index



Bedeutung:
Mit einem FULLTEXT - Index lassen sich in MySQL sehr große Textmengen sehr effizient indizieren und mit einigen netten Features wieder abfragen. Den FULLTEXT - Index sollte man allerdings nicht für kleinere Textmengen verwenden.


Allgemeine Form zum Anlegen eines FULLTEXT - Index:
ALTER TABLE tabelle
ADD FULLTEXT KEY indexName (feld1, feld2, etc.)


Allgemeine Form zum Abfragen eines FULLTEXT - Index (mit Sortierung nach Relevanz):
SELECT
feld1,
feld2,
MATCH(feld3, feld4, feld6, feld8) AGAINST ('suchbegriff1 suchbegriff2') AS relevanz
FROM tabellenName
MATCH(feld3, feld4, feld6, feld8) AGAINST ('suchbegriff1 suchbegriff2')


Allgemeine Form zum Abfragen eines FULLTEXT - Index (ohne Sortierung nach Relevanz):
SELECT
feld1,
feld2,
MATCH(feld3, feld4, feld6, feld8) AGAINST ('suchbegriff1 suchbegriff2') AS relevanz
FROM tabellenName


Bemerkungen zum Anlegens eines FULLTEXT - Index
Beim Anlegen eines FULLTEXT - Index nimmt MySQL eine Gewichtung der in den Feldern enthaltenen Wörter vor. Diese Gewichtung spielt u.a. bei einer späteren Abfrage eine große Rolle: Man kann sich daß Suchergebnis nach Relevanz absteigend sortieren lassen (siehe 'Allgemeine Form zum Abfragen eines FULLTEXT - Index'). Gibt man in der WHERE-Bedingung die MATCH-Funktion nicht erneut an, so werden die Ergebniszeilen unsortiert zurückgegeben.

Bei der Indizierung fallen standardmäßig alle Begriffe unter den Tisch, die kürzer als vier Zeichen sind (dies kann allerdings durch das Setzen der entsprechenden Variablen geändert werden). Wenn ein Begriff sehr häufig vorkommt bedeutet dies nicht unbedingt, daß er eine hohe Relevanz zugewiesen bekommt. Er kann unter Umständen sogar eine sehr niedrige Relevanz zugewiesen bekommen.

Die Begriffe werden entsprechend der Häufigkeit des Vorkommens in dem jeweiligen Datensatz und entsprechend der Häufigkeit des Vorkommens in der gesamten Tabelle gewichtet. Ein Volltext-Index ist somit immer in Beziehung zur jeweiligen Tabelle zu sehen. In einer anderen Tabelle mit anderen Inhalten kann ein Begriff eine ganz andere Relevanz zugewiesen bekommen.

Ein FULLTEXT - Index kann auch innerhalb sehr großer Tabellen angelegt werden. Das kann u.U. nur sehr lange dauern. Bei einer 500 Megabyte großen Tabelle kann das durchaus zwischen einer und zwanzig Stunden dauern. Die Sache ist natürlich auch abhängig von der Hardware des verwendeten Rechners (v.a. viel RAM und eine schnelle Festplatte sind hier wichtig).



Bemerkungen zum Abfragen eines FULLTEXT - Index
Wie oben schon angedeutet kann man sich die Relevanz der zurückgegebenen Datensätze bei einer Abfrage mit ausgeben lassen. Man muß es aber nicht.

In der Ergebnismenge werden die Datensätze am höchsten gewichtet, bei denen die meisten Übereinstimmungen gefunden wurden. Wurde z.B. nach 'Teller' und 'Haustür' gesucht, so werden sowohl Datensätze gelistet in denen nur der Begriff 'Teller' gefunden wurde als auch Datensätze in denen nur der Begriff 'Haustür' gefunden wurde. Am höchsten gewichtet werden die Datensätze, in den beide Begriffe gefunden wurden. Ausnahme: Die Datensätze in denen z.B. die Begriffe 'Teller' und 'Haustür' zu häufig vorkommen (siehe dazu auch weiter oben).

Der FULLTEXT - Index eignet sich nur zur Indizierung von (wirklich) großen Textmengen. Bei sehr kleinen Mengen an Text kann eine Abfrage auf den INDEX zu sehr verwunderlichen Ergebnissen führen.

Die Abfrage selbst von sehr großen Tabellen ist später auch auf normaler PC-Hardware sehr schnell. Die Zeiten bei einer 500 Megabyte großen Tabelle liegen zum Teil unter 0,1 Sekunden (AMD Athlon 1000, 256 MB SDRAM, HD mit 5400 U). Fast immer aber unter einer Sekunde. Allerdings hängt die Geschwindigkeit scheinbar sehr stark von der Menge der Ergebniszeilen ab: Die Angabe eines LIMIT kann die Abfrage ungemein beschleunigen. Die verwendete Hardware spielt natürlich ebenfalls eine große Rolle.

Die zweifache Angabe der MATCH-Funktion (in der Feldliste und in der WHERE-Bedingung) bedeutet nicht, daß die Abfrage doppelt so lange dauert als wenn die Funktion nur einmal im Statement enthalten wäre. MySQL merkt sich das Ergebnis der zuerst ausgeführten. Einen Geschwindigkeitsverlust soll es laut Manual nicht geben.



Zuküftige Features
In den Versionen nach 4.0 soll - neben einer höheren Geschwindigkeit - ein zusätzliches Feature implementiert werden: Die Möglichkeit der Verwendung von boolschen Operatoren und Klammerungen innerhalb der Suchanfrage wie man es von vielen Suchmaschinen her kennt.

Beispiel:
SELECT
feld1,
feld2,
MATCH(feld3, feld4, feld6, feld8)
AGAINST ('+suchbegriff1 suchbegriff2 -suchbegriff3' IN BOOLEAN MODE) AS relevanz
FROM tabellenName
MATCH(feld3, feld4, feld6, feld8)
AGAINST ('+suchbegriff1 suchbegriff2 -suchbegriff3' IN BOOLEAN MODE)


Bei solchen Abfragen ist dann der Zusatz 'IN BOOLEAN MODE' innerhalb der Klammer nötig. Daran erkennt MySQL, wie es die Suchanfrage zu interpretieren hat.

Begriffe denen ein Plus-Zeichen vorangestellt ist müssen im Ergebnis enthalten sein. Begriffe mit einem vorangestellten Minus dürfen nicht im Ergebnis enthalten sein. Wenn ein Begriff ohne Vorzeichen wie im Beispiel der Suchbegriff 'suchbegriff2' im Ergebnis enthalten ist, so wird dem entsprechenden Datensatz eine höhere Relevanz zugewiesen als einem in dem er nicht vorkommt.
 
Letzte Änderung: 17. Mai 2002, 22:26 Uhr


© 2002, Klaus Becker, becker-k@web.de