Suchmaschine für Websites: mnoGoSearch und das Umwandeln von Dateien in Text

searchLeider wurde die Entwicklung von htdig scheinbar eingestellt, und so wurde ich gezwungen nach Alternativen zu suchen. Aber alles der Reihe nach: was will ich denn, ausser 12 Stunden Schlaf? Also; An unserer Schule werden alle Unterrichtsunterlagen in SVN-Repositories abgelegt, Um das Zusammenarbeiten der Lehrpersonen zu fördern soll es eine Suche über alle Unterrichtsmaterialien geben. So besteht die Chance, dass einiges an Doppelspurigkeiten vermieden werden könnte. Eine Recherche hat einiges an Kandidaten aufgezeigt: Sphinx schien ein wenig SQL-Lastig zu sein, Swish-e kannte ich schon und somit habe ich mich mal auf mnoGoSearch gestürzt. Für Unix ist mnoGoSearch gratis, open Source und sogar in Debian verfügbar.

Suchmaschinen Theorie

Das mit den Lokalen Suchmaschinen läuft immer ziemlich ähnlich und wurde auch schon an verschiedenen Stellen in diesem Blog besprochen (Beagle (neu) und xFriend (alt)). Ein Indexer liest alle Dateien und erstellt einen – ja was denn wohl? – Index. Damit er das kann, müssen alle Dateien in eine für ihn lesbare Form umgewandelt werden. Normalerweise ist „Lesbar“ Text oder HTML. Einige Suchmaschinen – wie beispielsweise Lucene oder Swish-e – erlauben auch XML um gewisse Felder zu bezeichnen, aber das ist eine andere Geschichte. Eine Suchoberfläche interagiert nun mit dem Index und versucht möglichst viele Seiten zu Finden und diese nach Relevanz geordnet dem Benutzer zu präsentieren.

Installation in Debian

Man muss sich schon bei der Installation von mnoGoSearch entscheiden, wo und wie man den Index ablegen will (sqlite. pgsql oder mysql). Dazu braucht es noch alle Helferskripts um die verschiedenen Formate zu indizieren, was in folgende Befehlszeile eskaliert:

apt-get install bzip2 unrar-free unzip gzip unrtf \
  catdoc ppthtml xlhtml texlive-extra-utils metacam \
  poppler-utils mp3info vorbis-tools pstotext \
  mnogosearch-common mnogosearch-sqlite

Umwandeln von verscheidenen Formaten in Text

Wie oben erwähnt müssen alle zu indiziernden Dateien in ein für den Indexer verwertbares Format gebracht werden. Bei mnoGoSearch sind dies Text oder HTML. Die Formatierung muss nicht erhalten bleiben und es reicht völlig aus, wenn möglichst viel vom Inhalt vorhanden ist. Das Umwandeln von Officedateien war schon mal Thema in diesem Blog, doch ich möchte einen Schritt weitergehen. Hie geht um den Stolz: Es sollen so viele Dateitypen wie möglich indizieren können. Wenn jemand noch weitere, nette Umwandlungen kennt bin ich froh für jeden Hinweis.

Mimetype Definitionen

In mnoGoSearch funktioniert es so, dass man zuerst in der Datei /etc/mnogosearch/indexer.conf für Dateiendungen Mimetypes vereinbart. Mir ist es sicher nicht standardkonform gelungen, aber wir wollen ja auch keine Haare spalten, oder?

AddType image/x-xbitmap *.xbm
AddType image/gif       *.gif
AddType image/jpeg      *.jpg *.jpeg *.JPG *.JPEG

AddType audio/mp3       *.mp3
AddType audio/ogg       *.ogg

AddType application/zip         *.zip *.jar
AddType application/tgz         *.tgz *.tar.gz
AddType application/gnuzip      *.gz
AddType application/bzip        *.bz2
AddType application/compress    *.Z
AddType application/rar         *.rar
AddType application/tar         *.tar

AddType text/plain      *.txt  *.pl *.js *.h *.c *.pm *.e *.php *.java *.vbs *.TXT .me .ME *.inc *.bat *.vb *.csv *.tsv *.sql
AddType text/html       *.html *.htm

AddType text/rtf                        *.rtf
AddType application/msword              *.doc *.DOC
AddType application/powerpoint          *.ppt *.PPT
AddType application/vnd.ms-excel        *.xls *.XLS

AddType application/msword2007          *.docx *.DOCX
AddType application/powerpoint2007      *.pptx *.PPTX
AddType application/vnd.ms-excel2007    *.xlsx *.XLSX

AddType text/tex                        *.tex

AddType text/x-postscript               *.ps



AddType application/pdf                 *.pdf

Umwandeln von OOXML (docx, xlsx, pptx)

Für Microsofts OOCML von Office 2007 gibt es leider noch keine so einfache Lösung wie für die älteren Dateiformate. Ein „sauberer“ Weg würde wahrscheinlich über den ODF-Converter und/oder OpenOffice gehen, wie hier beschrieben. Ich wollte mir das nicht antun und mein einfacher Geist schrie nach einer einfachen Lösung (der Teil jedenfalls, der schreien kann, derjenige der für Kommandos zuständig war hat gerade geschlafen :irre2: ). Schnell war sie gefunden, die simple Lösung: OOXML-Dokumente sind Zip-Archive, damit kann man sie mit unzip entpacken und aus der entsprechenden XML-Datei die Tags entfernen. Gesagt, getan, getestet und Bier getrunken, da es zu funzen scheint:

docx2text:

#!/bin/bash
unzip -p $1 word/document.xml | sed -e 's/<[^>]*>/ /g'

xlsx2text:

#!/bin/bash
unzip -p $1 xl/sharedStrings.xml | sed -e 's/<[^>]*>/ /g'

pptx2text:

#! /bin/bash
unzip -p $1 ppt/slides/slide*.xml ppt/notesSlides/notesSlide*.xml | sed -e 's/<[^>]*>/ /g'

Umwandeln des Rests

Der Rest ist Standard. Die Archive sind nicht schön gelöst, da sie eigentlich entpackt und jede Datei gesondert betrachtet werden müsste. Naja, das ist mnoGoSearchs Problem und so wie hier gelöst besser als nix:

Mime application/msword       "text/plain; charset=utf-8" "catdoc -a -dutf-8 $1"
Mime application/vnd.ms-excel  text/html        "xlhtml $1"
Mime application/powerpoint    text/html        "ppthtml $1"

Mime application/msword2007       text/plain    "docx2txt $1"
Mime application/vnd.ms-excel2007 text/plain    "xlsx2txt $1"
Mime application/powerpoint2007   text/plain    "pptx2txt $1"

Mime text/rtf             text/plain    "unrtf $1"

Mime text/tex             text/plain    "detex"

Mime text/x-postscript    text/plain    "ps2ascii"
Mime application/pdf      text/plain    "pdftotext $1 -"

Mime image/jpeg           text/plain    "metacam $1"

Mime audio/mp3            text/plain    "mp3info $1"
Mime audio/ogg            text/plain    "ogginfo $1"

Mime application/zip      text/plain    "unzip -l $1"
Mime application/tgz      text/plain    "tar tfz $1"
Mime application/tar      text/plain    "tar tf $1"
Mime application/gnuzip   text/plain    "gunzip -l $1"
Mime application/bzip     text/plain    "bunzip2 -l $1"
Mime application/compress text/plain    "uncompress -l $1"
Mime application/rar      text/plain    "unrar-free -t $1"

mnoGoSearch Konfiguration

Nicht zu indizierende Dateitypen

mnoGoSearch bietet zur Beschleunigung die sogenannte Disallow Direktive. Dateien die auf diese Patterns passen, werden nicht indiziert. Hier sollte folgendes hinzugefügt werden:

Disallow *.svn*
Disallow *.dcr *.project *.swf *.dia *.db *.mdb

Ausserdem müssen alle Endungen die wir zusätzlich indizieren – und das ist ne Menge – aus der Konfiguration entfernt werden.

Umstellen auf Deutsch

Es gibt zwar eine I18N Version auf der mnoGoSearch Downloadseite, aber das ist Lug und Betrug und ausser einem einzigen, mikrigen String ist alles noch in Englisch. Im Template in /etc/mnogosearch/search.htm sind auch nicht alle Strings übersetzbar. Naja, selbst ist der Coder und das Resultat kann man natürlich downloaden: Deutsche mnoGoSearch Dateien.

  • search.htm: I18N version mit allen Worten internationalisiert und den Stopwörtern aktiviert.
  • search/lang.latin1.de.conf: Die deutsche Übersetzung
  • synonym/german.syn: Synonymdatei, heruntergeladen von Datapark.

Achtung, fertig, indiziere!

Mittels indexer -a kann nun ein kompletter Indizierungslauf gestartet werden. Ohne -a arbeitet der Indexer nur die neuen Dateien durch. Dies bietet sich an für einen Cronjob. search.cgi im cgi-bin Verzeichnis sucht nun in diesem Index… Aufrufen und freuen.

Bugs..?

Manchmal wird als Dateiname beziehungsweise Titel eines Fundes irgendwas wie /tmp/ind.1.blah angegeben… No Clue was das soll… Noch noer Clue was ich dagegen tun kann 🙁 …

3 Gedanken zu “Suchmaschine für Websites: mnoGoSearch und das Umwandeln von Dateien in Text

  1. Wenn mnogosearch ein Dokument (doc/xls/ppt/pdf) indiziert. wird das dokument ins /tmp verzeichnis kopiert/heruntergeladen und dort vom parser in text umgewandelt. danach wird es indiziert.
    /tmp/ind.1.blah ist der temporäre filename. dieser sollte aber nicht indiziert werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.