Enterprise Search mit Fess

Wer kennt das nicht? Man benötigt dringend eine Datei eines Kollegen, aber in welchem (Netzwerk-) Verzeichnis hat er diese abgelegt? Oder man möchte gerne den Artikel im Intranet lesen über den die Kollegen so angeregt diskutieren, aber wo anfangen mit der Suche? Diese Fragen müsste man sich nicht stellen, wenn ein Enterprise Search Server im Unternehmen eingesetzt würde.

Zur Klärung des Begriffs „Enterprise Search“ möchte ich gerne den ersten Satz des Wikipedia-Artikels zitieren, welcher die Begrifflichkeit, wie ich finde, sehr prägnant beschreibt.

„Enterprise Search bzw. Unternehmensweite Suche bezeichnet den Vorgang der computergestützten inhaltsorientierten Suche mit Hilfe einer unternehmensinternen Suchmaschine, welche Content mittels so genannter Crawler indexiert.“ (Quelle: Wikipedia)

Nachdem der Begriff Enterprise Search geklärt ist, wollen wir mittels des Fess Enterprise Search Servers klären, wie ein solcher Server aussehen kann und wie sich Crawler zum Indizieren des Suchindex konfigurieren und ausführen lassen.

Fess ist ein auf Java basierender standalone Enterprise Search Server und ist unter der Apache Lizenz frei verfügbar. Aufgrund der Tatsache, dass Fess auf Java basiert, lässt sich der Server in jede Serverumgebung (Windows, Unix, …) integrieren, welche die aktuelle JRE (Java Runtime Environment) Version installiert hat. Zum Durchsuchen, des durch die Crawler erstellten Index, wird eine Elasticsearch (ES) eingesetzt. Elasticsearch ist eine leistungsstarke Searchengine, welche auf Lucene basiert. Sie ist wie Fess in Java geschrieben und steht ebenso unter der Apache Lizenz.

Durch Zuhilfenahme eines Startskripts (verfügbar für Linux und Windows) sowie mittels des Administrationsbereichs lässt sich Fess, relativ problemlos, auch von nicht geübten Anwendern starten und konfigurieren.

Zu Demonstrationszwecken haben wir uns ein kleines Szenario ausgedacht, welches den Bedarf an einem Enterprise Search Server aufzeigen soll. Firmenintern hätten wir gerne die Möglichkeit gegeben unterschiedliche Datenquellen zu durchsuchen, um deren Informationen leichter für uns zugänglich zu machen. In unserem Fall handelt es sich dabei um eine MySQL-Datenbank, eine Netzwerkfreigabe sowie einer Webseite, die wir crawlen und indizieren möchten.

Installation

Bevor wir mit der Konfiguration der Crawler, zum Erstellen unseres Suchindex beginnen, befassen wir uns zunächst mit der Inbetriebnahme von Fess. Die kompilierte Version lässt sich unter http://fess.codelibs.org/downloads.html herunterladen. Für diejenigen, die sich für den Source Code interessieren steht ein git repository zur Verfügung (https://github.com/codelibs/fess). Nach dem Herunterladen, der als Zip zur Verfügung gestellten Version, kann diese an einer beliebigen Stelle entpackt werden. Standardmäßig wird für den Fess-Server der Port 8080 verwendet. Dieser lässt sich in den entsprechenden Startskripten anpassen.

# für Windows fess.bat
set FESS_JAVA_OPTS=%FESS_JAVA_OPTS% -Dfess.port=8080 # hier kann der Port angepasst werden 

# für Unix fess.in.sh 
FESS_JAVA_OPTS="$FESS_JAVA_OPTS -Dfess.port=8080" # hier kann der Port angepasst werden

Um Fess auszuführen werden folgende Befehle benötigt

$ unzip fess-x.y.zip
$ cd fess-x.y

 $ ./bin/fess # für Unix
> .\bin\fess.bat # für Windows

Nachdem Fess erfolgreich gestartet wurde, ist die Suchansicht unter http://localhost:8080 erreichbar. Um die Crawler zu konfigurieren müssen wir jedoch in den Administrationsbereich (http://localhost:8080/admin) der Anwendung wechseln (Benutzername/Passwort: admin). Fess bietet von Haus aus drei Standardcrawler zum Durchforsten von Webseiten, von Datenbanken sowie des Dateisystems (Lokal und Netzwerkfreigaben). Diese Crawler werden zur Informationsbeschaffung verwendet und bilden somit die Basis für den Suchindex. Sie durchsuchen die entsprechende Quelle und bereiten den Content für die Indizierung vor. Dabei werden zusätzlich zum reinen Textformat (wie er z. B. auch auf Webseiten zu finden ist) die Dateiformate von MS Office und PDF unterstützt.
Die konfigurierten Crawler werden nicht sofort, sondern mittels zeitgesteuerten Jobs ausgeführt. Die Jobs lassen sich unter dem Menüpunkt System > Scheduler verwalten. Die Zeiteinträge basieren auf der Cron-Timer Definition. Standardmäßig ist bereits ein Job definiert, welcher dafür sorgt, dass die Crawler einmal täglich ausgeführt werden.

Crawler Konfiguration

Web-Crawler

Zum schnellen Anlegen einer Vielzahl von Crawlern bietet Fass einen Wizard an. Dieser ermöglicht jedoch nur Einstellungsmöglichkeiten für den kleinsten gemeinsamen Nenner der unterschiedlichen Crawler. Dies hat zur Folge, dass jeder Crawler noch mal bearbeitet werden muss.
Zu Beginn legen wir einen Web-Crawler an, welcher die firmeneigene Webseite crawlen soll. Dazu navigieren wir im linken Menü zum Menüpunkt Crawler > Web und klicken auf den Button ‚Create New‘. Die folgende Abbildung zeigt die Konfiguration des neuen Crawlers.

WebCrawlerConfig

 

Mithilfe der Properties ‚Include/Exclude URLs For Crawling‘ bzw. ‘Include/Exclude URLs For Indexing’ lässt sich detailliert steuern, welche Teile der Seite in den Suchindex mit aufgenommen werden sollen und welche nicht. In Verbindung mit der Benutzerverwaltung lassen sich somit bestimmte Bereiche für entsprechende Benutzer freigeben oder sperren. Die URLs stellen einen regulären Ausdruck im Java-Format dar.

File-Crawler

Als zweiten Crawler wollen wir einen File-Crawler anlegen, welcher unser Tauschverzeichnis indiziert. Die Besonderheit an diesem Crawler ist, dass er sich authentifizieren muss, um das Verzeichnis zu durchsuchen. Zunächst müssen wir unter dem Menüpunkt Crawler > ‚File System‘ ein neunen Crawler anlegen. Im Prinzip unterscheiden sich die Einstellungsmöglichkeiten im Vergleich zum Web-Crawler nicht.

FileCrawlerConfig

Nachdem Anlegen des Crawlers kümmern wir uns um die Authentifikation für das Netzlaufwerk. Dazu müssen wir unter dem Menüpunkt Crawler > ‚File Authentication‘ einen neuen Konfigurationseintrag erstellen. Mittels der Property ‚File System Config‘ wird die Beziehung zwischen dem File-Crawler und der Authentifizierung definiert. (Eine Authentifizierung ist natürlich auch mit Web-Crawlern möglich).

FileAuth

DataSource-Crawler

Um auch die letzte Anforderung unseres kleinen Szenarios abzudecken, das Crawlen einer MySQL-Datenbank, legen wir unter dem Menüpunkt Crawler > ‚Data Store‘ den letzten Crawler an. Diese Konfigurationsmaske unterscheidet sich von den anderen beiden Masken im Wesentlichen in zwei Punkten, dem Parameter und dem Skript Teil.

Im Parameter Teil werden die Datenbankeinstellungen sowie die SQL-Abfrage hinterlegt

drivercom.mysql.jdbc.Driver
urljdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8
usernamefoo
passwordbar
sqlselect * from doc

Die .jar für den entsprechenden JDBC Treiber muss im Verzeichnis …/fess-x.y/app/WEB-INF/lib abgelegt werden. Damit der DB-Content auch indiziert werden kann, wird der ‚Script‘ Teil benötigt. In diesem wird das Mapping zwischen den Spalten aus der MySQL und der Index auf der Elasticsearch definiert.

url
hostPrinzipiell für ein DB Eintrag nicht relevant
sitePrinzipiell für ein DB Eintrag nicht relevant
titleTitel eines einzelnen Sucheintrags in der Suchmaske
contentDefiniert,den Inhalt über den später gesucht wird
digestKurzfassung, die für den einzelnen Sucheintrag angezeigt werden soll
content_lengthDefiniert die Größe eines einzelnen Sucheintrags
last_modifiedDefiniert wann der Eintrag zuletzt modifiziert wurde

Die Werte der Eigenschaften im Skriptteil lassen sich mittels der Skriptsprache Groovy nach Belieben zusammenbauen. Spalten aus der Datenbank lassen sich einfach per Namen ansprechen. Somit lässt sich z. B. die Kurzfassung (Property digest) aus dem Content zusammenbauen.

DataStoreCrawlerConfig
Der DataStore-Crawler unterstützt zusätzlich zu einer Datenbank auch CSV-Dokumente und Elasticsearch-Datasources.
Nach erfolgreicher Konfiguration der Crawler können diese gestartet werden. Dies lässt sich bewerkstelligen, indem man unter dem Menüpunkt System > Scheduler in der Job-Liste auf den Eintrag ‚Default Crawler‘ klickt und anschließende auf ‚Start now‘. Schon werden die Crawler gestartet und der Index erstellt. Nach wenigen Augenblicken kann über die Suchmaske die erste Anfrage abgesetzt werden.

SearchResult

Fess bietet zusätzlich zu den Crawlern eine Vielzahl von weiteren Ansichten und Einstellungsmöglichkeiten, um die Suche zu optimieren sowie die Verwaltung zu vereinfachen. Dazu gehört u. a. ein Key Matcher, der Umgang mit Host Duplikaten, sogenannten Suggestern, eine Benutzerverwaltung sowie diverse hilfreiche Bereiche um Logs einzusehen. Dies macht Fess zu einem leistungsfähigen Werkzeug für jedes Unternehmen. Ein weiteres Schmankerl sehe ich in der Anpassbarkeit der Benutzeroberfläche. Hier wurde eine Möglichkeit geschaffen die Oberfläche relativ komfortabel anzupassen. Somit steht einer nahtlosen Integration in ein bestehendes System nichts im Wege. Zusätzlich zu der Anpassbarkeit der Suchansicht sowie des Administrationsbereiches, bieten die Entwickler von Fess noch eine REST Schnittstelle an.

Fazit

Fess eignet sich ideal für Unternehmen, die nicht auf einen Enterprise Search Server verzichten und die Kosten geringhalten möchten. Durch Features wie z.B. Steuerung der Zugriffsrechte, bietet Fess zudem die Möglichkeit Firmenstrukturen abzubilden, um sensible Bereiche vor unberechtigtem Zugriff zu schützen. Durch eine LDAP-Schnittstelle lassen sich vorhandene Berechtigungsstrukturen weiterverwenden.
Ein kleiner Wermutstropfen: die Aktualität des Suchindex. Dieser wird nicht in Echtzeit aktualisiert, wenn z.B. ein Dokument in einer Netzwerkfreigabe erstellt oder aktualisiert wird. Aber: Die Zeitintervalle, in denen ein Crawler getriggert wird, können individuell auf dessen Aufgabe angepasst werden.
Aufgrund der Tatsache, dass es sich um ein Open-Source-Projekt handelt, muss man ein wenig Abstriche bezüglich der Dokumentation machen. Die Dokumentation (http://fess.codelibs.org/index.html) liegt sowohl in Japanisch als auch in Englisch vor. Dazu muss man jedoch sagen, dass die englische Dokumentation einige Lücken aufweist. Mein Tipp: Lasst euch die japanische Dokumentation mittels Google Translate ins Englische übersetzen.

Titelbild designed by Freepik

Veröffentlicht am 1. Juni 2016 in Blog

Autor: Fabian Valenca

Back to Top