{PROJECT} ../../template/doc.en.ini {GRAFIK_LINKS} $home/gifs/li_phpcms.gif {LOGO_1} $home/gifs/cmslogo1.gif {LOGO_2} $home/gifs/cmslogo2.gif {MENU} 00.08.10.11 {TITEL} Volltextsuche in phpCMS {CONTENT}

This document is currently being translated into English. Stand by. Sorry.

- Wie funktioniert die Volltextsuche in phpCMS?
- Erstellen des Volltextindexes.
- Aufbau eines Templates für die Anzeige der Suchergebnisse.
- Ergänzung des Menütemplates.
- Erstellen der Projektdatei.
- Anlegen einer Ergebnisseite.
- Aufbau eines Suchformulars.

Wie funktioniert die Volltextsuche in phpCMS?

Der Aufbau einer Volltextsuche für Eure eigene Homepage erfordert mehrere Schritte. Zuerst wird der Volltext-Index erstellt. Dabei werden sowohl normale HTML-Dateien als auch phpCMS-Content-Dateien indiziert. Danach legt Ihr ein eigenes Template für die Suchergebnisse an. Eine eigene Projektdatei für die Ergebnisseite ist ebenfalls erforderlich. Dann werden im Menütemplate einige Einstellungen vorgenommen. Danach erstellt Ihr eine Seite, in der die Suchergebnisse angezeigt werden sollen. Ist diese Seite fertig, bindet Ihr die Suchabfrage, das Formular, in eine oder mehrere Seiten ein.

Erstellen des Volltextindexes.

Überlegt Euch zuerst, ab welchem Verzeichnis Eurer Website indiziert werden soll. Ihr habt in dieser ersten Version der Volltextsuche von phpCMS die Möglichkeit, innerhalb des zu indizierenden Verzeichnisses bis zu drei Verzeichnisse anzugeben, die ignoriert werden sollen. Es ist eine kluge Idee, für große Seitenteile Eurer Homepage einen eigenen Index zu erstellen. Mit phpCMS könnt Ihr beliebig viele Indizies erstellen und somit beliebig viele Suchen ermöglichen. Derzeit ist die Nachindizierung von Seiten noch nicht möglich, es muß also immer bei groben Änderungen ein kompletter Index erstellt werden.

Ein Index-Vorgang kann unterschiedlich lange dauern. Das hängt sehr vom Umfang der indizierten Daten ab. Meine Website hier, die unter anderem die komplette Dokumentation vom Apache-Webserver, das Kompendium SELFHTML von Stefan Münz und die Dokumentation von PHP spiegelt umfasst ca. 3.000 Seiten. Die Erstellung eines Indexes dieser ganzen Seite dauert mit phpCMS ca. 20-30 Minuten. Dabei werden temporär zusätzlich, zum bereits verbrauchten Webspace ca. 5 MB belegt. Ihr solltet also bevor Ihr zu indizieren beginnt checken, ob Ihr noch genug Webspace zur Verfügung habt. Nach der erfolgten Indizierung reduziert sich der Verbrauch ungefähr auf 1/5 der temporären Größe.

Jetzt überlegt Ihr Euch, wohin der Index installiert werden soll, wenn er erstellt ist. Am besten macht Ihr Euch eine Liste mit diese Überlegungen (es kommen noch ein paar dazu). phpCMS bietet die Option, den Index als normale Dateien zu speichern, oder mit gzip zu komprimieren. Um die komprimierte Version zu nutzen, muß bei Eurem Provider aber das zlib-Library installiert sein (phpinfo() is your friend). Der komprimierte Index belegt wesentlich weniger Speicherplatz (nur ca. 1/3 des Unkomprimierten), verlangsamt aber den Suchvorgang, da der Index erst im Speicher dekomprimiert werden muß, bevor die Suche durchgeführt werden kann. Also: Nächste Entscheidung auf der Liste = gzip oder nicht gzip.

Jetzt müßt Ihr entscheiden, wieviele Zeichen bei der Anzeige des Suchergebnisses ausgegeben werden sollen. Ein guter Wert liegt bei ca. 300 Zeichen. Wählt Ihr zu wenige Zeichen, kann sich der User unter dem Ergebniss nichts vorstellen, zu viele Zeichen verlangsamen die Anzeige des Suchergebnisses.

Eine Stopwortdatei enthält jene Wörter, die nicht in den Index aufgenommen werden sollen. Ihr erstellt eine solche Datei einfach mit einem Texteditor und speichert sie am Webserver in einem Verzeichnis Eurer Wahl. Eine Stopwortdatei enthält die Wörter, getrennt durch einen Zeilenumbruch:

- und
- ihr
- seine
- eure

Alle Stopwörter werden klein geschrieben. Ein Beispiel einer solchen Stopwortdatei findet Ihr im Verzeichnis "parser/include". Diese Datei heißt "stop.db" und enthält Stopwörter in Deutsch und Englisch. Ihr könnt für jeden Index eine eigene Stopwortdatei erstellen, oder Ihr benutzt für alle Indizies die selbe Datei. Vor der Erstellung des Indexes muß man das in den Optionen angeben. Also auf die Liste damit!

Bei der Entwicklung der Volltextsuche und des Indexers bin ich auf das Problem gestoßen, dass einige Provider timeouts für PHP-Skripte gesetzt haben. Bei längeren Laufzeiten von Skripten, werden diese dann einfach abgebrochen. Dabei wird der Index natürlich zerstört. Um das zu umgehen, wird in mehreren Schritten indiziert. Je größer diese Schritte sind, um so schneller geht der Vorgang der Indizierung. Ihr könnt diese Schrittgröße ebenfalls in den Optionen einstellen und zwar unter dem Namen "Blockgröße". Der Vorgabewert sind 200.000 Byte, für einige Provider sicher bereits zu groß. Ihr tastet Euch am Besten schrittweise an das Limit Eures Providers heran, um die optimale Einstellung herauszufinden. Habt Ihr optimale Blockgröße gefunden, könnt Ihr diese in der Datei "default.php" die Ihr im Verzeichnis "parser/include" findet eintragen.

Jetzt überlegt Euch, wie lange die kürzesten Wörter sein dürfen, die noch indiziert werden. In den Optionen stellt Ihr die minimale Wortlänge ein. Achtung: Wörter die kleiner als zwei Buchstaben sind akzeptiert das Suchskript nicht. Je länger die kürzesten Wörter sind, die indiziert werden, um so schneller funktioniert die Suche. Das System funktioniert hervorragend mit der Einstellung einer Wortlänge von drei Buchstaben.

Nun sind wir endlich so weit, den Index-Vorgang zu starten. Ruft einfach die Datei "parser.php" ohne Optionen auf. Nach Eingabe des Paßwortes (dass Ihr hoffentlich längst geändert habt), klickt links auf den Menüpunkt "Volltextsuche" und gebt die Optionen auf Eurer Liste ein. Was Ihr habt keine Liste? Dann passiert den Start, kassiert keine 200. :-)

Nach einem Klick, auf den Button "Indizieren starten" beginnt die Indizierung. Zuerst wird eine Liste mit allen Wörtern gebildet. phpCMS zeigt Euch als Status, welche Dateien gerade indiziert wurde und wie lange das gedauert hat, sowie wieviele Dateien noch zu indizieren sind. Die erste Statusinfo kann ein paar Sekunden dauern, nicht ungeduldig werden. Nachdem die Wortliste gebildet ist, startet der Merger automatisch. Der Merger scheidet doppelte Wörter aus und erfasst die Häuffigkeit von vorkommenden Wörtern in einzelnen Seiten. Auch der Merger liefert Status-Informationen. Am Ende des Mergers erhaltet Ihr eine Anzeige, wie lange der gesamte Vorgang gedauert hat. Auch der Merger funktioniert mehrstufig, also erst wieder klicken, wenn Ihr die Meldung habt, dass der Indiziervorgang abgeschlossen ist. Ihr zerstört sonst den Index.

Das wars, der Index ist erstellt.

Aufbau eines Templates für die Anzeige der Suchergebnisse

Dieses Template ist im Prinzip ein ganz normales Template von phpCMS. Den einzigen Unterschied zu normalen Templates bildet ein Feld, statt dem dann die Suchergebnisse angezeigt werden. Ihr tragt dieses Feld wie folgt ein:

> {SEARCHRESULT SEARCHTEMP="SUCHE"}

Das Schlüsselwort "SEARCHRESULT" bezeichnet, dass an dieser Stelle im Template die Suchergebnisse angezeigt werden. Der Parameter "SUCHE" im obigen Beispiel besagt, dass aus dem Menütemplate die Werte mit den Namen "SUCHE" ausgelesen werden sollen. Diese Werte tragen wir bei der Erstellung des Menütemplates ein.

Erstellen der Projektdatei

phpCMS-Profis wissen jetzt sicher schon was kommt: Im wesentlichen handelt es sich um eine ganz normale Prjektdatei, die lediglich, statt auf das normale Template, auf das Template zeigt, daß wir gerade für die Sucher erstellt haben.

Ergänzung des Menütemplates

Im Menütemplate stellt phpCMS einige Felder und TAGS zur Verfügung, mit deren Hilfe das Aussehen der Ausgabe beeinflusst werden kann. Die Felder sind:

- {TITLE} - der Titel der gefundenen Seite
- {RANKING} - die Wertung nach der Gewichtung der gefundenen Wörter
- {URL} - die komplette URL der gefundenen Seite
- {FWORDS} - die Such-Begriffe, die in dieser Seite gefunden wurden
- {TEXT} - die ersten Zeichen im Content der gefundenen Seite (wieviele habt Ihr zuvor bei der Indizierung eingestellt)

Die TAGS, die Ihr zur Anzeige benutzen könnt sind:

- <SEARCH_TIME> - wie lange der Suchvorgang gedauert hat
- <WORD_COUNT> - die Anzahl der insgesamt gefundenen Suchbegriffe, wenn mehrere Begriffe angegeben wurden
- <PAGE_COUNT> - die Anzahl der gefundenen Seiten, die Suchbegriffe enthalten

Über diese "eingebauten" TAGS hinaus, könnt Ihr in der TAG-Datei folgende TAGS definieren:

- <RANK_5> - Das höchstrangige Ergebnis bei der Suche. Hier könnt Ihr einen Text oder eine Grafik einsetzen.
- <RANK_4> - Das nächst-niedrigere Ergebnis bei der Suche.
- <RANK_3> - Das nächst-niedrigere Ergebnis bei der Suche.
- <RANK_2> - Das nächst-niedrigere Ergebnis bei der Suche.
- <RANK_1> - Das niedrigste Ergebnis bei der Suche.
- <NO_DATA_DIR> - Die Fehlermeldung, wenn kein Daten-Verzeichnis gefunden wurde.
- <NO_SEARCH_TERM> - Die Fehlermeldung, wenn kein, oder ein fehlerhafter Suchbegriff angegeben wurde.
- <NO_SEARCH_RESULT> - Die Fehlermeldung, wenn kein Ergebnis gefunden wurde.
- <SEARCH_PREV> - Der Text oder die Grafik, die angezeigt werden soll um nach vorne zu blättern.
- <SEARCH_MIDDLE> - Der Text oder die Grafik, die zwischen "vorne" und "zurück" angezeigt werden soll.
- <SEARCH_NEXT> - Der Text oder die Grafik, die angezeigt werden soll um nach hinten zu blättern.
- <QUERY_TERM> - Der gesuchte, oder die gesuchten Begriff(e).

Diese TAGS dürfen nirgends sonst in phpCMS oder Euren eigenen Seiten benutzt werden, sonst kommt es zu falschen Ausgaben durch den Parser. Das Menütemplate der Demo enthält also z.B. folgende Einträge:

> {SEARCH.SUCHE.PRE}
> <font face="Arial" size=3><b>Ergebnisse:</b></font><br>
> <font face="Arial" size=1>Suchzeit: <SEARCH_TIME><br>
> Anzahl der gefundenen Begriffe: <WORD_COUNT><br>
> Anzahl der gefundenen Seiten: <PAGE_COUNT></font>
> <table border=0 cellspacing=0 cellpadding=0 width=600><tr><td>
> {SEARCH.SUCHE.NORMAL}
> <hr><font face="Arial" size=2><b><a href="{URL}">{TITLE}</a></b></font><br>
> <font size=1>Reihung: {RANKING}</font><br><br>
> <font face="Arial" size=2>{TEXT} ...</font><br><br>
> <font size=1>Gefundene Begriffe: {FWORDS}</font>
> {SEARCH.SUCHE.PAST}
> </td></tr></table>

Anlegen einer Ergebnisseite

Auch bei der Seite, die für die Anzeige der Ergebnisse angelegt wird, handelt es sich um eine normale phpCMS-Content-Datei. Es gelten alle Rahmenbedingungen, wie bei einer normalen Content-Datei. Lediglich der Projekt-Eintrag zeigt auf die vorhin angelegte Projekt-Datei.

Aufbau eines Suchformulars

Jetzt wird es wieder kniffelig. Das Formular mit dem die Suche Ausgelöst wird, muß bestimmte Felder enthalten:

FeldnameFeldtypWertBedeutung actionform-actionergebnis/_parseext_zeigt auf die Ergebnisseite methodform-actionPOSTMethode, mit der das Formular gesendet wird datadirhiddenDatenverzeichnisJenes Verzeichnis in dem der Index abgelegt ist. gziphidden"on" oder "off"Komprimierung wird verwendet oder nicht querytextleerFür die Eingabe der Suchbegriffe

In HTML sieht das dann in etwa so aus:

> <form action="$home/ergebnis/_parseext_" method = "POST">
> <input type="hidden" name="datadir" value="$home/suche">
> <input type="hidden" name="gzip" value="on">
> <input name="query" value="" type="text" size=20 maxsize=30>
> <input type="submit" name="submit" value="go get it">
> </form>

Achtung: Wenn Ihr Euren Index mit Komprimierung erstellt habt, muß das versteckte Feld "gzip" den Wert "on" enthalten. Habt Ihr ohne Komprimierung gearbeitet, darf das Feld nur "off" enthalten oder es ist gar nicht vorhanden. Standard-Einstellung vom Such-Skript ist "off".