Michael Schröpl: stopword-list zum SELFForum

Beitrag lesen

Hi Cheatah,

Ist die Reihenfolge wirklich so von Bedeutung? Krass.
hätte ich auch nicht gedacht, das hat Michael Schröpl mir kürzlich erklärt, und es stimmt wirklich ;-)
MySQL ist lustig[tm] :-)

wenn mySQL einen FULLTEXT-Zugriff auf mehrere Suchbegriffe durchführen will, dann gibt es dafür ja verschiedene Implementierungsstrategien.

Es könnte beispielsweise ein JOIN zwischen den dabei erzeugten Treffermengen machen - wenn diese Mengen jeweils ähnlich groß sind, ist das wahrscheinlich eine gute Idee.

Sind die Mengen aber extrem unterschiedlich groß, dann könnte mySQL auch erst mal nur einen Indexzugriff für den ersten Suchbegriff machen und dann "nachdenken": Hoppla, das sind ja nur zehn Treffer, da spare ich mir den JOIN und prüfe die andere Bedingung über einen direkten Zugriff auf diese Zeilen".
Zugegeben, gerade bei FULLTEXT ist es nicht wahrscheinlich, daß so etwas Vorteile bringt, aber bei einem beliebigen AND kann ich mir sehr wohl vorstellen, daß es hilft.

Und je besser ein SQL-Optimizer ist (vor allem: je kostenbezogener er arbeitet), um so eher macht es Sinn, über einen solchen "Plan B" nachzudenken, weil er dafür zusätzliche Informationen nutzen kann (z. B. die durchschnittliche Projektionswirkung eines Index oder sogar die konkrete Wirkung eines Suchbegriffs, siehe ANALYZE TABLE). In diesem Falle "wüßte" die Datenbank nämlich vielleicht, daß 10 Treffer "gut" sind, gemessen an der mittleren Projektivität des Index.

Auf die Idee bin ich übrigens gekommen, weil die bisherige Suche "such.pl" genauso arbeitet: Sie macht zwar einen "full table scan" über die Indexdatei, prüft dann aber die Liste der Terme bis
zum Fehlschlagen.
Die Prüfung ist auch dort abhängig davon, wie selten ein Suchbegriff ist - wenn der erste Suchbegriff schon kaum Treffer liefert, dann müssen nur diese wenigen Treffer auf weitere Suchterme geprüft werden - shortcut-AND eben.
Ich hatte mir damals auch mal überlegt, vor der eigentlichen Suche eine passende Sortierung der Suchbegriffe vorzunehmen, hatte aber nie die Infrastruktur dafür, so etwas zu bauen.

Was ich bräuchte sind ein paar Reguläre
Ausdrücke die mal so richtig in der Tabelle
aufräumen,
Richtig wäre, bereits nur die gewollten Daten
in die DB zu schreiben.

Genau das tut FULLTEXT auch - dafür gibt es in  deren Quelltext die fest eingebrannte Stopwortliste und die Forderung einer Mindestlänge für "Worte".
Auch ein "!!!!" wird gar nicht erst im FULLTEXT-Index gespeichert, weil es nicht auf die wordchar()-Funktion von mySQL matched. (Insofern sollte die Stopwortliste auf der exakt gleichen wordchar-Logik aufbauen, die anschließend von der MATCH()-Funktion verwendet wird.)

Diese drei Quelltexteinstellungen im myISAM-Tabellentreiber sind die Schräubchen, an denen man bei mySQL 3.x im Quelltext drehen muß ... mySQL 4 soll diese dann als Konfigurationsdirektiven zugänglich machen, glaube ich gehört zu haben.

Viele Grüße
      Michael