[PHP] Suche

glowhand

Programmierer
21 April 2006
273
16
Hallo!
Sthee weniger vor einem Problem, eher möchte ich einfach mal, für zukünftige Projekte, wissen, wie man eine ordentliche Suche über eine MySQL-Datenbank programmiertechnisch durchführt...
Nehmen wir als Beispiel einmal das Klammforum. Bei über 800.000 Beiträgen ist es doch eigentlich unmöglich allein durch einen leistungsstarken Server binnen von Sekunden sämtliche Beiträge nach einem oder mehreren Wörtern zu suchen.
Theoretisch würde ich das so programmieren:
Einfach alle Beiträge aus der Datenbank holen und in einem Array speichern lassen, darauf jeden Array-Eintrag durch strpos oder ähnlichem zu durchsuchen... Aber das dauert ja eigentlich seine Zeit...
Also... wie löst z.B. das vBulletin das Problem? Genauso ist es bei diversen Meinugnsportalen (ciao, dooyoo, yopi), die Testberichte sind oft ellenlang, und es sind Tausende verfügbar... Wie ist das so schnell möglich?
Freue mich auf Antworten bzw. Denkanstöße.
 
Also wenn überhaupt dann wird die Volltextsuche von MySQL erledigt (SELECT * FROM table WHERE text LIKE "%Wort%"), aber auch dieses System stößt schnell an seine Grenzen.
Bei vielen Foren funktioniert die Suche so, dass es eine Wörter-Tabelle gibt (wortid (int) als Primary Index, wort (varchar) als Unique Index), wo jedes Wort, das irgendwann einmal in diesem Forum geschrieben wurde, hinterlegt wurde. Außerdem gibt es eine Post-Wort Tabelle (postid (int), wortid(int)) in der jedem Post alle Wörter, die in ihm geschrieben sind, zugeordnet sind (also viele Einträge pro Post).
Sucht nun jemand nach einem Wort, wird in der Wort-Tabelle die wortid erfragt und dann werden über die Post-Wort-Tabelle die Posts gesucht, in denen das gesuchte Wort vorkommt (SELECT pw.postid FROM postwort AS pw, wort AS w WHERE w.wort = "Wort" and pw.wortid = w.wortid). Oder zumindest so ähnlich^^ ;)
 
Also das mit der Volltextsuche in Mysql mit 'LIke %wort%' mag ich so nicht glauben - diese Verfahren ist ewig langsam, da ein Platzhalter am Anfang steht, und nach meiner Einschätzung auch keine echte Volltextsuche. Seit Version 5 oder so unterstützt MySQL eine echte Volltextsuche über Indexe mittels MATCH. Dieses Verfahren kann ich mir für umfangreiche Datenbestände vorstellen, aber besitze keine Erfahrungen damit bzgl. Geschwindigkeit und Trefferverhalten.

Gruß aus Berlin

leller
 
Das was MrToiz geschrieben hat vergiss einfach, wenn dein Server nicht aufeinmal abbrechen sollen, es gibt direkt von MySQL weit bessere Möglichkeiten.
leller meint schon das richtige, es gibt in MySQL einen Volltextindex der ist genau für solche Probleme entwickelt worden und arbeitet sehr sehr effizient. Natürlich ist es noch klüger die max Anzahl an zu durchsuchenden Einträgen zu reduzieren.


Beispiel:
Code:
SELECT id, MATCH (title,body) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) AS score FROM articles;
 
Ja das stimmt. Eine Volltext suche geht erstens nicht über LIKE, zweistens ist sie zwar was absoulut berauschendes, jedoch was absolut serverlastiges.

Vor und nachteil.

Zu einer Volltextsuche musst du in der DB die zugehörigen Spalten verknüpfen, damit es geht.