Aktuelles zu Suchmaschinen auf meinem Wiki.
1. Aufgabenstellung
Für meine eingene Website möchte ich eine Suchmaschine anbieten, mit denen der Besucher, zusätzlich zur ausgeklügelten Navigation auch über eine Volltextsuche über alle meine Webseiten möglichst direkt das finden kann, was er/sie sucht.
Die dafür eventuell erforderlichen technischen Komponenten auf der Server-Seite müssen sehr genau überlegt werden, denn ein billiger Web-Hosting-Provider bietet da nur sehr wenig.
Zur Zeit ist die eigene Website bei t-online gehostet. Als Provider mit PHP und MySQL steht auch free.fr zur Verfügung.
2. Lösungsmöglichkeiten
- Fremdanbieter: Provider für solche Website-Suchmaschinen
- ht://Dig (SourceForge)
- mnogosearch
- siteIndexer (SourceForge)
Siehe auch: http://www.searchtools.com
3. Lösungsarchitektur
Wichtig ist die Erkenntnis, das hier eine Schichtenarchitektur sinnvoll ist, wobei die untern dargestellten drei Schichten unterschiedliche systemtechnische Anforderungen aben und auch auch unterschiedlichen Systemplattformen laufen könnten.
3.1. Indexing - Harvesting
Man benötigt einen wirklich guten Indexer, der die Website wie ein Spider per HTTP-Protokoll durchläuft und dabei den auf der Oberfläche sichtbaren Text indiziert. Damit werden die Hyperlinks durchlaufen, dynamische inhalte (z.b. von PHP, ASP, JSP-Seiten) richtig behandelt, Zeichensätze (Umlaute) richtig beachtet und ggf. weitere Dokumenttypen (PDF, Word, Powerpoint,...) auch verarbeitet.
Das Ergbnis ist eine Dokumentliste und eine Wortliste.
Diese Komponente muss nicht notwendig als Web-Applikation laufen.
3.2. Schnelle Indexdatenbank
Die in der Stufe 1 (Indexing/Harvesting) gewonnenen "Rohdaten" werden jetzt veredelt und für den Zweck des schnellen Suchzugriffs optimiert aufbereitet.
Diese Komponente muss nicht notwendig als Web-Applikation laufen.
3.3. Schnelle Such-Oberfläche
Über ein HTML-Formular soll der Anwender seine Suchbegriffe eingeben. Das Suchergebniss soll dann als Fundstellenliste präsentiert werden.
Diese Komponente muss zwingend als Web-Applikation laufen.
4. Lösungsauswahl
Für das russische mnogoserach spricht die Verwendung von PHP für die Search-Funktion.
Allerdings wird ein modifiziertes PHP benutzt, das man sich selbst durch Compilation erzeugen muss. Da die Lösung bei einfachen Providern laufen soll, scheidet diese Variante aus.
Für die Variante ht://Dig spricht:
Die sehr grosse Verbreitung und damit eine Sicherheit für eine mittelfristig gesicherte Nutzung
ht://Dig wird als Bestandteil der SuSE 8.0 Edition mit ausgeliefert (binary)
Eine Compilation unter Win98 mit Cygwin war auf Anhieb erfolgreich.
Nachteil bei ht://Dig ist nachwievor, dass die Such-Oberfläche als CGI-Executable realisiert ist. Nicht jeder Web-Hosting-Provider lässt "freie CGIs" zu.
Die Auswahl fiel trotzdem auf ht://Dig, da die Ausgereiftheit und Mächtigkeit der Funktionen sowie die solide Community einfach überzeugen. Der Nachteil der CGI-Suchoberfläche wird im Sinnne der Architektur in Kauf genommen, mit der Idee, dafür im Laufe der Zeit einen Austausch vorzunehmen. Die Idee ist, eine PHP-Suchoberfläche entweder direkt auf die Berkely-DB2-Datenbank zu setzten, oder die DB2 auf MySQL zu konvertieren und dann eine PHP-Oberfläche darauf zu setzen.
5. Lösung mit ht://Dig
5.1 Beschaffung
ht://Dig Version 3.1.6 wurde von sourceforge.net beschafft und zum Texten auf Win98 unter Cygwin umgewandelt.
Dabei hat der "Idiot's Guide to installing ht://Dig on Win32" sehr geholfen.
Die Produktiv-Version der Suchmaschine soll unter Linux (SuSE 8.0) laufen und dort war ht://Dig 3.1.5 bereits als Bestandteil der Erstinstallation vorhanden.
5.2 Konfiguration: htdig.config
max_head_length: 10000 --> 50000
max_doc_size: 200000
description_meta_names: description
keywords_meta_names: keywords
maximum_word_length: 12 ---> 24
bad_extensions: .mid .swf .asf .mp3
locale: de_DE
translate_quot: true
5.3 Indexing
cd /opt/www/htdig/bin
./htdig -v -c ../conf/htdig.conf
./htmerge -v -c ../conf/htdig.conf
5.4 Searching
<form method="post" action="http://myserver/cgi-bin/htsearch">
<input type="hidden" name="method" value="and">
<input type="hidden" name="format" value="builtin-long">
<input type="hidden" name="sort" value="score">
<input type="hidden" name="config" value="htdig">
<input type="hidden" name="restrict" value="">
<input type="hidden" name="exclude" value="">
<p>Search this Website:</p>
<input type="text" size="15" name="words" value="" style="background-color: #99CCFF;">
<input type="submit" value="Suchen">
</form>
6. Erweiterungen
ht://Dig benutzt seit Version 3.1.0 als Datenbank "Berkeley DB2" (http://www.sleepycat.com ).
Die Idee ist, mit PHP auf diese Datenbank zuzugreifen. Dazu muss ein PHP mit DBA-Unterstützung beim Web-Hosting-Provider vorhanden sein und dann als "DBA-Handler" db2 unterstützen. Tests mit phpinfo() ergaben:
SuSE 8.0 mit PHP 4.1.0
dba
DBA support | enabled |
Supported handlers | gdbm ndbm |
Win98 mit PHP 4.1.1
dba
DBA support | enabled |
Supported handlers | db3 |
Provider free.fr mit PHP 4.2.2
dba
DBA support | enabled |
Supported handlers | ndbm db2 |
Erstes PHP-Script "phpdbatest1.php" zum Lesen der ht://Dig Berkeley DB2 Dokumentendatenbank
Näheres bei Colin Viebrock: http://www.devshed.com/Server_Side/PHP/Search_This/Page1.html
<?php
$id = dba_open("db.docdb","r","db2");
if ($id) {
echo "<p>dba_open succsessful</p>";
$key = dba_firstkey ($id);
$i = 0;
while ($key != false) {
$i = $i + 1;
echo "$i: $key <br>";
$key = dba_nextkey ($id);
}
echo "<h3>nextDocID: " + dba_fetch("nextDocID",$id) + "</h3>";
dba_close($id);
} else {
echo "dba_open failed\n";
}
?>
Testweiser Aufruf dieses PHP-Scripts.
Perl-Script zum Lesen der ht://Dig Berkeley DB2 Dokumentendatenbank
In www.cpan.org findet man das Perl Modul htdig-database-0.52 womit man mithilfe von Perl-Scripts in ht://Dig-datenbanken lesen kann. Diese aktuelle Version funtioniert auch mit ht://Dig 3.1.5 mit der Berkeley DB2 Datenbank.
Testaufruf:
cd \htdig\bin
perl listdocdb -v ../conf/htdig.conf
Durch Beschäftigung mit diesem perl-Skript kann man sicher eine Menge über die Struktur der Datenbank lernen und die Erkenntniise auf PHP übertragen......