Dateisuchmaschine mit PHP
Wer sucht, der findet

DeveloperIT-ProjekteSoftware

Auf Servern im Internet und Intranet liegen oft Unmengen von Dateien. Suchfunktionen können helfen, diese Datenmengen sinnvoll zu verwalten. Internet Professionell zeigt, wie Sie Ihre Datenbestände über eine Web-Oberfläche durchsuchbar machen.

Open Source

Dateisuchmaschine mit PHP

Auf den meisten Computern sammeln sich im Lauf der Zeit riesige Datenmengen. Oftmals sind diese wild verstreut und schlecht auffindbar. Aus diesem Grund liegen Desktop-Suchmaschinen voll im Trend, um Datenbestände, die auf einem Rechner gespeichert sind, ohne großen Aufwand wieder zu finden. Was aber, wenn die Daten nicht auf dem lokalen Rechner, sondern auf einem Server im Netzwerk oder gar im Internet abgelegt sind? Desktop-Suchmaschinen helfen dann nicht weiter. In diesem Artikel wird die Umsetzung einer Volltextsuche auf einem Server mit Open-Source-Mitteln beschrieben, die die Daten eines Servers umfasst und via Web-Oberfläche bedient werden kann.


Search-Engine: Swish-E

Dateisuchmaschine mit PHP

Der Kern einer Suchmaschine ist die Such-Engine. Sie ist dafür verantwortlich, die Dateien zu indizieren und eine Möglichkeit zur Verfügung zu stellen, mit der nach den Dateien gesucht werden kann. Kostenlose Open-Source-Produkte gibt es in diesem Bereich unzählige. Für die hier beschriebene Lösung fiel die Wahl auf Swish-E, da es alle notwendigen Eigenschaften mitbringt, die für eine solide und schnelle Suchmaschine notwendig sind.

Swish-E ist ein Nachfolger der von Kevin Hughes entwickelten Engine Swish. Es wird heute von einem kleinen Entwicklerteam gepflegt. Durch seine Programmierung in C ist Swish-E sehr schnell. Sowohl die Suche von Dateien als auch ihre Indizierung geht auch bei sehr großen Datenmengen in atemberaubender Geschwindigkeit vonstatten. Trotzdem ist Swish-E portabel programmiert und steht somit auf jedem wichtigen Betriebssystem zur Verfügung. Neben Linux, für das die Installation in diesem Artikel beschrieben wird, befindet sich auch Windows auf der Liste der unterstützten Betriebssysteme.

Für Swish-E besteht die Welt nur aus Text. Von Haus aus kann es nur Formate indizieren, die textbasierend sind, beispielsweise HTML und XML. Da dies natürlich für eine Dateisuchmaschine nicht ausreichend ist, lässt Swish-E sich durch so genannte Filter erweitern. Ein Filter ist in der Regel ein Programm, das ein Dateiformat in Text umwandelt, der wiederum vom Indizierer verarbeitet werden kann. In dem hier beschriebenen Beispiel werden Filter für Word-, Excel-, Powerpoint- und PDF-Dateien eingesetzt. Denkbar sind weitere Filter wie zum Beispiel für Open Office und andere Formate.


Architektur

Dateisuchmaschine mit PHP

Den Kern der Server-Suchmaschine bildet somit Swish-E mit seinem Indizierer und der Standard-Suchschnittstelle als Kommandozeilen-Tool. Wie nahezu alle Volltextsuchmaschinen sucht auch Swish-E aus Geschwindigkeitsgründen bei einer Suchanfrage nicht in den Dateien selbst, sondern in einem vorgefertigten Volltext-Index. Dieser Index wird durch den Swish-Indexer aus den Inhalten der Dateien erzeugt. Er enthält die notwendigen Daten, um anhand eines Suchbegriffs die Dateien zu finden, in denen dieser vorkommt.

Da auf einem Datei-Server ständig neue Dateien hinzukommen oder sich Dokumente verändern, muss auch der Volltext-Index laufend angepasst werden. In dem hier beschriebenen System wird der Indizierer zyklisch durch Cronjobs gestartet. Auf den so erzeugten und aktualisierten Index wird über eine Web-Oberfläche zugegriffen, deren PHP-Skripts die Kommandozeilenschnittstelle von Swish-E nutzen, um den Suchbefehl anzusetzen. Das so gelieferte Ergebnis wird von den PHP-Skripts geparst und als HTML-Seite ausgegeben.


Installation: Got Root?

Dateisuchmaschine mit PHP

Für die Installation dieser Suchlösung ist ein Server mit Root-Rechten notwendig, um die notwendige Software zu installieren. Sollten Sie ein Webhosting-Paket ohne Root-Rechte besitzen, finden Sie im Kasten »Alternativen« einige Such-Engines, die Sie auch auf solchen Servern einsetzen können.

Eine Serverumgebung mit PHP 4 oder 5 ist Voraussetzung für das beschriebene System. Diese ist auf den meisten Servern bereits vorhanden oder kann mit wenigen Kommandos nachinstalliert werden. Wie für jede andere Software gibt es unter Linux auch für Swish-E und den notwendigen Filter zwei Wege, um diese zu installieren. Zum einen kann die Software anhand des Sourcecodes kompiliert werden, zum anderen steht oft auch der Weg über den Paketmanager der Distribution zur Verfügung (Yast, Apt, Yum und andere). In vielen Linux-Distributionen lässt sich Swish-E so installieren, und es reicht ein einfaches Kommando wie

apt-get install swish-e

unter Debian-basierten Betriebssystemen. Nach Möglichkeit sollten Sie Swish-E auf diesem Weg installieren, sofern er für Ihre Distribution zur Verfügung steht. Für alle anderen kann die Software direkt aus dem Quellcode erzeugt werden. Unter www.swish-e.org/download kann der Quelltext für die jeweils aktuellste Swish-E-Version heruntergeladen werden. Im Moment ist das die Version 2.4.3. Die Installation kann mit den folgenden Kommandos ausgeführt werden. Bitte beachten Sie, dass Sie diese Kommandos als Root-Benutzer ausführen müssen:


> tar xvzf swish-e-2.4.3.tar.gz
> cd swish-e-2.4.3
> ./configure
> make
> make install


Dateiformate

Dateisuchmaschine mit PHP

Swish-E ist jetzt so weit installiert, dass Textdateien indiziert werden können. Damit andere Formate ebenfalls genutzt werden können, bedarf es der Installation weiterer Software. Für folgende Programme gehen Sie bei der Installation genauso vor, wie bereits gezeigt (entpacken, configure, make und make install):

– Antiword (www.antiword.org): Umwandlung von Word-Dateien in Text.

– xlhtml (chicago.sourceforge.net/xlhtml): Filter für Excel Dateien.

– ppthtml (chicago.sourceforge.net/xlhtml): Filter für Powerpoint Dateien. Die Datei ist im Projekt xlhtml enthalten.

– pdftohtml (sourceforge.net/projects/pdftohtml): Wandelt PDF Dateien in Text um.

Für alle aufgeführten Filter existieren auch Windows-Versionen, so dass eine Verwendung auf einem Windows-Server ebenfalls möglich ist.


Konfiguration & Erweiterung

Dateisuchmaschine mit PHP

Swish-E ist nach der Installation direkt einsatzfähig, allerdings indiziert die Standardkonfiguration einfach alle Textdateien unterhalb des momentan aktuellen Verzeichnisses. Da dies wenig sinnvoll ist, kann eine eigene Konfigurationsdatei für die Suche und Indizierung angegeben werden. Das folgende Listing zeigt eine Konfigurationsdatei, in der alle notwendigen Einstellungen vorgenommen wurden, um neben Textdateien auch Word-, Excel-, Powerpoint- und PDF-Dateien zu indizieren:


IndexFile /usr/inetpro/test.index
IndexDir /usr/inetpro/files/
IndexReport 3
ParserWarnLevel 1
NoContents .jpg .gif .jpeg .png .tif .bmp .eps
IndexContents HTML .html .htm
DefaultContents HTML
MetaNames swishdocpath

FileFilter .pdf /usr/bin/pdftohtml "\"%p\" -stdout -q -noframes -i"
FileFilter .doc /usr/bin/antiword "\"%p\""
FileFilter .xls /usr/bin/xlhtml "-fw \"%p\""
FileFilter .ppt /usr/bin/ppthtml "\"%p\""
StoreDescription HTML 320
StoreDescription XML* 320
StoreDescription TXT 320
IgnoreWords File: ./german.txt

Mit IndexFile und IndexDir in den ersten Zeilen der Konfigurationsdatei wird festgelegt, wo die zu indizierenden Dateien auf dem Server liegen und wohin der Volltext-Index gespeichert werden soll. Diese Pfade müssen auf Ihren Server angepasst werden. Mit der Zeile NoContents werden Dateitypen definiert, deren Inhalt nicht in den Volltext-Index aufgenommen werden brauchen. Im Falle des Beispiels sind dies Grafikdateien, Sie können die Liste aber auch um andere Dateitypen erweitern, die Sie nicht indiziert haben möchten.


Filter

Dateisuchmaschine mit PHP

Wichtig ist das Einbinden der Filter für Nicht-Textdateien. Für jedes Format wird hier ein Filter angegeben, eingeleitet mit dem Befehl FileFilter. Dieser Filter ist ein externes Programm, das das angegebene Dateiformat in für Swish-E lesbaren Text umwandelt. Der Eintrag StoreDescription legt fest, wie viele Zeichen als Beschreibung der Datei gespeichert werden sollen. Diese Beschreibung kann im Suchergebnis mit ausgegeben werden.

Zu guter Letzt kann mit IgnoreWords noch eine Datei angegeben werden, in der Wörter stehen, die nicht im Suchindex landen sollen. Dies sind Wörter wie und, oder, ein, einer, eine, die so allgemein sind, dass sie in jeder Datei gefunden werden und nach denen nicht sinnvoll gesucht werden kann. Swish-E bietet noch viele weitere Konfigurationsmöglichkeiten, die allerdings den Rahmen dieses Artikels sprengen würden. Unter www.swish-e.org/docs finden Sie eine weitergehende Dokumentation. Die vollständige Beispiel-Konfigurationsdatei und eine Stopwort-Datei in Deutsch finden Sie auf der Heft-CD dieser Ausgabe, ebenso wie Swish-E und die beschriebenen Filter.


Indizierung & Kommandozeile

Dateisuchmaschine mit PHP

Nachdem Swish-E installiert ist und die passende Konfigurationsdatei existiert, kann mit dem folgenden Befehl die Indizierung der Dateien vorgenommen werden:

swish-e -c /home/inetpro/search.conf

Dieses Kommando erzeugt einen Volltext-Index für alle Dateien des in der Konfiguration angegebenen Verzeichnisses. Da es auf die Dauer lästig wäre, die Indizierung immer manuell anzustoßen, ist es sinnvoll, einen Eintrag in der Cronjob-Tabelle des Systems vorzunehmen, so dass die Indizierung zyklisch zu bestimmten Zeiten vom System ausgeführt wird. Um beispielsweise immer nachts um 1 Uhr zu indizieren, öffnen Sie mit

crontab -e

die Cronjob-Tabelle des aktuellen Benutzers und fügen den folgenden Eintrag hinzu (zum Editieren muss die Taste [i] gedrückt werden):

0 1 * * * user swish-e -c /home/inetpro/search.conf

Ersetzen Sie user durch den Namen des Benutzers, unter dem der Server gestartet ist. Natürlich sind auch mehrere Einträge zu unterschiedlichen Zeiten möglich. Nach dem Speichern der Datei mit dem Befehl :wq! wird das System die Indizierung automatisch zu den angegebenen Zeiten vornehmen.

Swish-E bietet zur Suche ein Kommandozeilen-Interface. Mit dem folgenden Befehl wird im gerade erzeugten Index nach dem Wort »overview« gesucht:

swish-e -f /usr/inetpro/test.index -w "overview"

Diese Kommandozeilenoberfläche wird auch von der Web-Oberfläche genutzt, um an die Ergebnisse zu gelangen.


Web-Oberfläche

Dateisuchmaschine mit PHP

Die Skripts der Web-Oberfläche finden Sie auf der Heft-CD. Entpacken Sie das Verzeichnis in einen Ordner Ihres Webservers. Um die Suchoberfläche einsatzfähig zu machen, müssen noch einige Konfigurationsarbeiten vorgenommen werden. Die Web-Oberfläche selbst muss durch die Anpassung der Datei config.inc.php konfiguriert werden. Dies beschränkt sich auf die Änderung der beiden Parameter $DOCUMENT_PATH und $INDEX_FILE_PATH. An dieser Stelle tragen Sie den Basis-Pfad der Dokumente und den genaue Datei-Pfad des Volltext-Indexes ein.

Der letzte Konfigurationsschritt muss in der httpd.conf-Datei des Apache-Servers direkt vorgenommen werden. Dieser Schritt ist notwendig, da die durchsuchbaren Dateien in der Regel nicht im Zugriffsbereich des Webservers liegen. Damit dies möglich wird, müssen in der Apache-Konfiguration folgende Zeilen eingetragen werden


Alias /documents /pfad/zu/den/Daten

AllowOverride None
Options +ExecCGI -Includes
Order allow,deny
Allow from all

Nach der erfolgreichen Konfiguration und dem anschließenden Neustart des Webservers oder des gesamten Systems ist die Suchanwendung einsatzbereit und kann aus einem Browser heraus genutzt werden.

Swish-E erlaubt die Verwendung von Wildcards und booleschen Operatoren wie AND und OR zur einfacheren Suche nach Dokumenten. Swish-E akzeptiert Wildcards allerdings nur am Wortende, nicht am Anfang und im Wort. Wollen Sie nach Wörtern suchen, die mit »Internet« beginnen, so verwenden Sie den Suchbegriff »internet*«. Unzulässig wäre dagegen ein Suchbegriff wie »*provider«. Selbstverständlich kann auch nach mehr als einem Wort gesucht werden. Ein Suchbegriff »Swish Volltext« findet alle Dokumente in denen das Wort Swish oder das Wort Volltext vorkommt. Sollen nur Dateien gefunden werden, die beide Worte enthalten, so muss der Suchbegriff »Swish AND Volltext« lauten.

Swish-E berücksichtigt nicht nur den Inhalt einer Datei für die Ergebnisliste, sondern auch den Dateinamen und den Pfad, unter der diese zu finden ist. Nur so werden auch Binärdateien wie Grafiken gefunden.


Fazit

Dateisuchmaschine mit PHP

Mit Swish-E und ein wenig PHP-Quellcode kann eine einfache Dokumentensuche für das Intranet und Internet implementiert werden. Zwar ist einiges an Vorarbeit in Form von Konfigurationen notwendig, um die einzelnen Komponenten zusammenzubringen. Dieser anfängliche Aufwand wird aber mit einem schnellen und leistungsfähigen Suchsystem belohnt.
Die PHP-Klassen der beschriebenen Web-Oberfläche können einfach an eigene Anforderungen und Designs angepasst werden. Dadurch ist die Lösung universell einsetzbar.

Alle Dateien und Listings zum Workshop finden Sie auf der Heft-CD und unter listings.internet-pro.de.