Allegemeine Fragen zu Volltextsuche

Hallo Zusammen,

bevor ich die Doku durchwälze und vielleicht auf Postgre umsteige frage ich einfach die Experten.

Ich programmiere eine Website in PHP und MySQL und brauche eine gute Volltext-Suchfunktion. Im MySQL kann man das über LIKE oder REGEXP regeln, was langsam bzw. sehr langsam sein könnte. Besser ist so eine Suche mit Volltext-Index, aber… und hier fangen die Probleme an und deshalb überlege ich, ob PostgreSQL es so machen kann wie ich mir das vorgestellt habe.

Es geht darum, dass ich einerseits eine Bewertung der Ergebnisse brauche, also die Relevanz der gefundenen Sätze, was der MySQL mit einem Volltext-Index kann. Er kann das zwar nicht mit der booleschen Suche, aber das kann man anders hinkriegen.

Die 1. Frage ist also, ob ich so was auch mit Postgre machen kann?

Was der MySQL mit dem Volltext-Index bzw. -Suche nicht kann ist, ein Wort finden das sich das gesuchte Wort auch in einem längeren Wort befindet. D. h. gefunden wird alles, was mit z. B. word beginnt, also quasi word* (auch mit booleschen Suche ist das so :-(). MySQL Volltext-Index bzw. -Suche kann aber *word nicht.

Wenn ich also nach word suche, dann möchte ich, dass gefunden wird: word, abcword, wordabc und abcwordabc. Des Weiteren wenn gesucht wird nach wo rd, dann sollten natürlich auch die o. g. Ergebnisse kommen.

Zusätzlich wäre auch wichtig, dass nach genau einer bestimmten Zeichenfolge gesucht werden kann, d. h. wenn jemand nach (genau) word sucht (also quasi “word”), dann sollten nur die Datensätze gefunden werden die das Wort word enthalten und nicht abcword, wordabc oder abcwordabc.

Die 2. Frage ist also ebenfalls, ob ich das mit Postgree realisieren kann?

Wenn das möglich sein sollte würde ich mich freuen, wenn Ihr mir auch sagen könnt, wie schwer bzw. aufwendig der Umstieg von MySQL 5.0.x auf PostgreSQL ist?

Ich freue mich auf Eure Antworten und Vielen Dank für Eure Hilfe schon im Voraus! :slight_smile:

CU

Gregor

Hallo,

für die Volltextsuche solltest du dich einmal mit tsearch2 beschäftigten. Das findest du im contrib Verzeichnis, es gibt aber auch eine eigene Webseite dafür.

Das andere, was du möchtest, sowohl ganze Wörter wie Wortbestandteile finden, kann man mit einer Volltextsuche nur schwer erledigen. tsearch2 z.B. kann dir ganze Wörter suchen, aber Bestandteile suchen ist ein Problem für jede DB, weil du alle Texte Zeichen für Zeichen durchsuchen musst.
Es gibt, wie bei Mysql, ebenfalls LIKE (und ILIKE) und ausserdem Regexp Suchen in PostgreSQL. Diese kannst du dabei verwenden, allerdings mach dir bei den Geschwindigkeiten keine großen Hoffnungen, das wird sehr, sehr langsam werden.

Danke für Deine schnelle Antwort.

Also das bedeutet, dass ich mit Tsearch2 auch nur nach word* und Ähnlichen suchen kann aber *word oder word nicht einfach so möglich sind? Du schreibst sowas wäre scher zu realisieren - was genau wäre schwer daran? Muss man die Ergebnisse nachbearbeiten oder wären die Abfragen sehr gorß…??

Danke Dir!

CU

Gregor

Nach wort zu suchen brauchst du keine Volltext Suchmaschine, da nimmst du LIKE/ILIKE für oder einen Regexp.

Das ist nicht sonderlich schwer zu realisieren … es ist nur die langsamste aller Möglichkeiten, da die Datenbank jedes einzelne Textfeld von vorne bis hinten durchsuchen muss.

Das ist etwas, was man ja eigentlich vermeiden möchte, hier kann man keinen Index ansetzen, keine Abkürzungen, keine Tricks, nichts. Das Wort könnte ja überall vorkommen. Sprich, für deine Datenbank ist es der Worst Case für eine Suche.

hmmm…
Ich komme also langsam zu dem Ergebnis, dass mir PostgreSQL nicht weiterhelfen kann, weil:

  1. die Index-Suche resultierend ähnlich wie bei MySQL aussieht und

  2. eine Suche nach *word oder word bei beiden DBMS analog durchgeführt werden würde

…und ich jetzt also die niedrigere Geschwindigkeit einfach so in Kauf nehmen muss. Mir bleibt also nichts anderes übrig, als zu schauen, dass ich meinen Server bzw. meine Datenbank möglichst performant halte (schneller CPU + viel RAM ;-)), oder ich müsste auf eine der großen DBMS umsteigen, was aus Kostengründen ja nicht möglich wäre.

Ich hoffe, ich habe das so richtig verstanden und werde mich also jetzt (wahrscheinlich) auf die REGEXP-Suche konzentrieren müssen.

Vielen Dank für Deine Hilfe!

CU

Gregor