Andreas: Lokale Suchmaschine

Beitrag lesen

Hallo Michael!

Vorab schonmal Danke für die ausführlichen Antworten, damit hilfst Du mir sehr, bzw. hast mir in der Vergangenheit schon sehr geholfen! Vielen Dank!

Das _bekommt_ der Benutzer mit.
Es kann allerdings sein, daß dieser Faktor 7 deshalb
nicht auffällt, weil er nur bei Datenmengen stört,
die so klein sind, daß der Grundaufwand (CGI-Anbindung
etc.) höher ist als die eigentliche Suche.

Ich habe im Prinzip 2 Möglichkeiten, wenn ich Phrasensuche ermöglichen will:
1. Mache ich das mit einer eigenen Index-Tabelle
2. oder ich mache einfach so viele einzelne Abfragen nacheinander wie Worte in der Suche vorkommen über die besagten Fulltext-Index Spalten. Das hört sich zwar nicht wirklich vernünftig an, aber wie viele Leute suchen nach mehr als 3,4 Wörtern?
Dafür könnte ich mir die Index-Tabelle sparen, die ja sehr schnell eine Mio Datensätze und mehr haben würde, ob das so gut wäre? ich denke der Fulltext-Index in mysql dürfte das schneller und sparsamer machen, oder?

Ob das Ergebnis dann eine CSV-Daten oder eine SQL-
Tabelle ist, das ist relativ egal - aber ob Du
einfach eine Datei aufmachst oder eine Datenbank-
schnittstelle per SQL ansteuern mußt, das ist für
jemand, der in SQL nicht fit ist, sehr wohl ein
Unterschied.

Ich meinte halt, das mit ein MySQL Daten schneller durchsuchen kann als PHP, da dafür optimiert!

Das ist in der Tat ein Problem. Aber Du mußt ja nicht
die Relevanzfunktion von mySQL verwenden. Du mußt auch
nicht deren FULLTEXT verwenden - ein Wort-Indexer ist
schnell geschrieben, und der könnte die Relevanz eines
Wortes für ein Dokument unter Berücksichtigung _aller_
Spalten bereits vor dem Einfügen dieses Wortes in die
Datenbank berechnen. Du hättest also eine Tabelle mit

CREATE TABLE fulltext AS
  search_word      <irgend ein char-Typ>
  search_quality   <integer>
  document_id      <primary key der anderen Tabelle>

und würdest suchen mit

SELECT document_id, search_quality
   FROM fulltext
  WHERE search_word = <suchbegriff>
  ORDER BY search_quality DESC;

oder so ähnlich.

Sehr interessant - und so einfach, da wäre ich nie drauf gekommen, nur wie soll ich das erstellen? Wenn ich tatsächlich 1.000 Seiten mit je 10.000 Worten gleichzeitig indizieren will, mal abgesehen vom php-timeout, soll ich in einer schleife 10 Mio Inserts starten? Wie soll das gehn? Womit? oder mit mysql < file.sql einlesen?

Außerdem ´habe ich das problem, dqas ich wahrscheinlich 80% der Wörter gar nicht brauche, da danach eh nicht gesucht wird. Nur leider kann man das nur sehr schwer automatisiert machen, höchtens ein paar die ganz oft vorkommen in einen arra schreiben und immer prüfen ob if(in_array("Wort")) oder sowas. Wäre aber wohl eher ein Tropfen auf den heißen Stein oder?

Grüße
Andreas