Lokale Suchmaschine für die eigene Webseite
30.05.2014
Nachdem ich mir einen Vergleich von Open Source Suchmaschinen angesehen und die Suchmaschine Mnogosearch kurz angetestet hatte, bin ich bei Mnogosearch geblieben. Die Dokumentation von Mnogosearch ist ausführlich und gut verständlich. In meine Website habe ich rechts oben ein Suchfeld eingebaut, das auf Mnogosearch zugreift. Neben dem Suchfeld gibt es noch eine eigenständige Seite zur Suche in meiner Website.
Einziger kleiner Kritikpunkt an Mnogosearch ist, dass das Projekt in der Entwicklung stehengeblieben ist. So ist das Suchtemplate nicht XHTML-konform bzw. HTML5-konform und benutzt Tabellen zur Positionierung der Suchergebnisse. Mittlerweile habe ich mir die Mühe gemacht und das Suchtemplate XHTML-konform gestaltet. Hier sind drei Varianten des Suchtemplates von Mnogosearch:
XHTML-konformes Template für Mnogosearch
XHTML-konformes Template für Mnogosearch ohne Tabellen
XHTML-konformes Template für Mnogosearch ohne Tabellen, mit deutscher Übersetzung
Das Suchtemplate muss nach etc/search.htm der Mnogosearch-Installation kopiert werden.
Mnogosearch Zusammenfassung
In diesem Abschnitt habe ich die wichtigsten Kommandozeilen für Mnogosearch Version 3.3.15 zusammengefaßt. Eine neuere Version 3.4.1 wäre hier erhältlich. Beginnen wir mit der Installation unter Linux:
Installation
wget https://www.torsten-traenkner.de/wissen/webseite/mnogosearch-3.3.15.tar.gz
tar xzvf mnogosearch*.tar.gz
cd mnogosearch*
# for the database mysql configure with-mysql:
./configure --with-mysql --with-zlib --with-openssl
# to install mnogosearch into a certain directory use prefix:
# e.g. for /usr/local/test/mnogosearch/
./configure --with-mysql --with-zlib --with-openssl --prefix=/usr/local/test/mnogosearch/
# maybe you need to install some packages for mysql
# apt-get install libmysqlclient-dev
make
sudo make install
Das war die grundlegende Installation von Mnogosearch aus dem Quellcode.
Konfiguration der Datei etc/indexer.conf
Jetzt muss Mnogosearch für die eigene Website indivuell konfiguriert werden. Dabei sind die drei wichtigsten Änderungen in der Datei indexer.conf die Zeilen: DBAddr mit Benutzername, Passwort und Datenbank-Name von der eigenen Mysql-Datenbank, LocalCharset für Unicode und Server für die zu durchsuchende Website.
# or your own configured directory:
# cd /usr/local/test/mnogosearch/etc
sudo bash
# create the configuration of the indexer:
cp indexer.conf-dist indexer.conf
# edit the indexer.conf
# the 3 most important changes are:
# change this line: DBAddr mysql://root@localhost/test/?dbmode=blob to
DBAddr mysql://<USER>:<PASSWORD>@localhost/<DATABASE_NAME>/?dbmode=blob
LocalCharset UTF-8
Server https://www.torsten-traenkner.de/
Wenn die Mysql-Datenbank richtig konfiguriert ist, dann kann der indexer von Mnogosearch jetzt schon die Webseiten des Servers aus dem Beispiel "https://www.torsten-traenkner.de" indexieren und in der Mysql-Datenbank mit dem Benutzernamen <USER>, Passwort <PASSWORD> und Datenbankname <DATABASE_NAME> mit der Kodierung Unicode (UTF-8) abspeichern.
Achtung ! Sowohl die Datei etc/indexer.conf als auch etc/search.htm enthalten jetzt das Passwort der Mysql-Datenbank. Diese Dateien müssen durch chmod oder z.B. .htaccess so abgesichert werden, dass sie nicht öffentlich zugänglich sind.
Installation des Mysql-Servers
Falls noch keine Mysql-Datenbank eingerichtet ist, dann gibt es hier eine kleine Anleitung für die Linux-Distribution Ubuntu bzw. Linux Mint:
apt-get install mysql-server
# during installation enter the <PASSWORD> for the root user of the mysql database
# check that mysql daemon is running after the installation
netstat -plant | grep 3306
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN .../mysqld
# log in to mysql with your root account
mysql -u root -p<PASSWORD>
# create a database called <DATABASE_NAME>
create database if not exists <DATABASE_NAME>;
# create <USER> to test mnogosearch
GRANT ALL PRIVILEGES ON *.* TO '<USER>'@'localhost' IDENTIFIED BY '<PASSWORD>' WITH GRANT OPTION;
exit
# on newer mysql versions use:
CREATE USER '<USER>'@'localhost' IDENTIFIED BY '<PASSWORD>';
GRANT ALL PRIVILEGES ON *.* TO '<USER>'@'localhost' WITH GRANT OPTION;
# test the new user:
mysql -u <USER> -p"<PASSWORD>" <DATABASE_NAME>
exit
Nachdem jetzt ein Benutzer und eine Datenbank in Mysql angelegt sind, kann Mnogosearch die Tabellen in der Datenbank anlegen und die zu durchsuchende Seite indexieren.
Indexieren mit Mnogosearch
cd /usr/local/mnogosearch/sbin
./indexer -Ecreate
# maybe you also need:
./indexer -Eblob
# start indexing:
./indexer -am
# clear the database
# only if you think that it is necessary
echo YES | ./indexer -C
Das ganze funktioniert natürlich auch auf dem Webserver eines Hosting-Anbieters. Zum Test kann die Datenbank auch über mysqldump exportiert werden.
mysqldump -u <USER> -p"<PASSWORD>" <DATABASE_NAME> > dumpfilename.sql
# restore:
mysql -u <USER> -p"<PASSWORD>" <DATABASE_NAME> < dumpfilename.sql
Suchen mit Mnogosearch
Jetzt kommt die eigentliche Suche dran. Zunächst muss noch die Datei etc/search.htm konfiguriert werden:
cd /usr/local/mnogosearch/etc
# become root user
# and download an XHTML template for the search
wget https://www.torsten-traenkner.de/wissen/webseite/search.htm.xhtml_conform.tablefree -O search.htm
# use the same DBAddr as in indexer.conf
grep ^DBAddr indexer.conf
# edit search.htm
# change this line: DBAddr mysql://root@localhost/test/?dbmode=blob to
DBAddr mysql://<USER>:<PASSWORD>@localhost/<DATABASE_NAME>/?dbmode=blob
# as non root user
# search the database for a keyword:
export QUERY_STRING="q=test"; /usr/local/mnogosearch/bin/search.cgi > /tmp/test.html
Jetzt sollte die Datei /tmp/test.html die Suchergebnisse enthalten. Allerdings enthält sie noch einen Content-Header. Der muss je nach Benutzung aus dem Quellcode herausgepatcht werden.
Mnogosearch patchen bzw. individuell anpassen
cd mnogosearch-3.3.15/src/
wget https://www.torsten-traenkner.de/wissen/webseite/search.c.diff
# this patch is specific to version 3.3.15
patch -p0 < search.c.diff
# build mnogosearch again
cd ..
make
sudo make install
Mnogosearch von PHP aus aufrufen
Mnogosearch gibt es auch als PHP-Modul. Als Alternative kann Mnogosearch über die exec oder passthru Funktion von PHP aufgerufen werden. Im folgenden Kasten steht ein minimales Beispiel mit PHP-Code zum Aufruf von Mnogosearch:
<?php
$newcommand='export QUERY_STRING="'.$my_query_string.'";/path/to/mnogosearch_install_3.3.15/bin/search.cgi';
passthru($newcommand, $return_variable);
?>
ACHTUNG: Der Suchstring "my_query_string" sollte vorher auf eine maximale Länge und Sonderzeichen geprüft werden - zum Beispiel mit dem Aufruf: "http_build_query".
Ungewöhnliche Dateien mit Mnogosearch indexieren
Während des Indexierens bekam ich die Mnogosearch-Meldung Unsupported Content-Type 'application/javascript'. Um die Meldung nicht mehr zu erhalten, habe ich die Datei etc/indexer.conf angepaßt.
# edit etc/indexer.conf
AddType application/javascript *.js
Mime application/javascript text/plain "cat"
# index again
cd /usr/local/mnogosearch/sbin/
./indexer -am
Allerdings macht es meiner Erfahrung nach nicht viel Sinn die Javascript-Dateien zu indexieren, da sie zu viele irrelevante Wörter enthalten.
Kompatibilität von Mnogosearch
Mnogosearch 3.3.15 ist mit der MySQL Server Version 5.7 kompatibel. Leider scheint es in MySQL 8.0 einige Änderungen gegeben zu haben, die zu einer Inkompatibilität mit Mnogosearch Version 3.3.15 führen. Zum Beispiel setzt Mnogosearch die "storage_engine" über den SQL-Befehl "SET storage_engine=MyISAM;". In der MySQL-Version 8.0 wurde dieser Wert in "default_storage_engine" umbenannt. Außerdem gibt es in MySQL einige Einschränkungen (constraints), so dass manche Werte mit "NOT NULL" durch "UNIQUE" ersetzt werden müssten. Zum Glück bietet mein Webhoster Goneo noch MySQL Server Version 5.7 an.
Das war meine Zusammenfassung. Viel Spaß mit Mnogosearch!
Letzte Änderung: 2021-12-29