Aufbau einer Intranetsuche leicht gemacht, dank Open Source

von Tobias Stengel

Jeder kennt vermutlich das folgende Szenario aus eigener Erfahrung: Vor längerer Zeit hat man an einem Projekt gearbeitet und sucht nun verzweifelt nach einem Dokument, in dem bspw. eine Schnittstelle fachlich spezifiziert wurde. Doch wo wurde das Dokument bloß von den Kollegen abgelegt? 

Dieser Blogeintrag beschreibt die einfache Realisierung einer Suchanwendung im Intranet für Dokumente unterschiedlichster Dateiformate, die in einem SVN-Repository sowie auf zentralen Laufwerken abgelegt sind. Dies bedeutet also, dass die Suchanwendung Input aus verschiedenen Quellsystemen erhält. 
Als Suchserver wird elasticsearch verwendet. Das Frontend für die Suche wurde mit Grails umgesetzt.

Indexieren der Dokumente

Zunächst ist es wichtig, die Dokumente zu indexieren und eine regelmäßige Aktualisierung des Indexes zu gewährleisten, um Änderungen an den Dokumenten in der Suche abbilden zu können. 
Zur Indexierung der Laufwerke wird ManifoldCF in der Version 1.1.1 eingesetzt. ManifoldCF ist ein Open Source Projekt, dessen Ziel es ist, verschiedene Quellsysteme zur gemeinsamen Indices oder Repositories zu verbinden. ManifoldCF bietet einige Vorteile: 

  • Im Idealfall ist kein eigener Code nötig, um geänderte Dokumente aufzufinden und diese zu indexieren
  • Unterstützung für eine Vielzahl von Quellsystemen, wie bspw. SharePoint oder zentrale Laufwerke
  • Nicht auf elasticsearch als Suchserver beschränkt; es ist eine Vielzahl sogenannter OutputConnectoren vorhanden, z.B. auch für Solr
  • Graphische Oberfläche wie in der nachfolgenden Grafik exemplarisch dargestellt zur leichteren Konfiguration der zu indexierenden Ordner, Planung der Ausführungszeitpunkte etc.)

Der in ManifoldCF bereits vorhandene Elasticsearch-Output-Connector wurde angepasst, da die vorhandene Implementierung für den Anwendungsfall nicht ausreichend geeignet war. Diese Anpassungen sind im Wesentlichen 

  • Statt des attachment-Plugin von Elasticsearch übernimmt der Connector selbst die Analyse der Dokumente (unter Verwendung von Tika). Dadurch ist eine wesentlich feinere Kontrolle der im Index gespeicherten Informationen möglich.
  • Die Verbindung zum Elasticsearchserver wurde von einem HTTP-Client auf einen TransportClient geändert. Beim HTTP-Client treten einige Probleme mit Sonderzeichen, Zeilenumbrüchen etc. beim Senden der extrahierten Informationen an Elasticsearch auf.

Input aus den Quellsystemen

ManifoldCF ist derzeit nicht in der Lage SVN-Repositories direkt zu indexieren. Jedoch ist es möglich, Ordner im lokalen Dateisystem zu indexieren. Damit ist es möglich, das Repository auszuchecken und danach mit svn up regelmäßige Updates durchzuführen, um die ausgecheckten Dateien zu aktualisieren. Diese Dateien werden schließlich mit ManifoldCF indexiert.  
Aus Performancegründen wurde diese Lösung jedoch verworfen. Wenn man svn up ausführt, so erhält man eine Liste mit allen hinzufügten, geänderten oder gelöschten Dateien sowie jeweils die Angabe, welcher Fall vorliegt. 
Über eine separates kleines Javaprogramm die Ausgabe des svn-Updates eingelesen und nur die darin verzeichneten Dateien wird die entsprechende Aktion durchgeführt. Obwohl dieses Programm die Aktionen in mehreren Threads parallel ausführt, ist es nur etwa 150 Zeilen lang. Zur Analyse der Dokumente wird ein Teil des angepassten ManifoldCF-Codes, der oben beschrieben wurde, wiederverwendet. 
Dieses Vorgehen erspart gegenüber ManifoldCF die Iteration über alle ausgecheckten Dateien, um neue, geänderte und gelöschte Dateien zu identifizieren. Da im Anwendungsfall die Anzahl der geänderten Dateien gegenüber der Gesamtzahl Dateien sehr klein ist, beschleunigt sich der Indexierungsprozess enorm. Der gesamte Vorgang wird über einen cronjob gesteuert. Wenn keine Änderungen vorliegen, ist die Dauer des Vorgangs im Wesentlichen identisch mit der Zeit, die svn up benötigt. Müssen dagegen alle oder fast alle Dokumente neu indexiert werden, so dauert der Vorgang etwa so lange wie mit oben beschriebenen ManifoldCF-basierten Ansatz. 

Neben dem SVN-Repository wird als zweites Quellsystem das öffentliche Firmenlaufwerk indexiert. Hier existiert für ManifoldCF ein Standard-Konnektor, der lediglich über die ManifoldCF-Oberfläche konfiguriert werden muss.

Performance

ManifoldCF ist in der Lage, den Fileshare (ca. 70 000 Dateien) in etwa 15 Minuten nach Änderungen zu durchsuchen und diese zu indexieren. Wurden sehr viele Dokumente geändert oder hinzugefügt, so verlängert sich die Laufzeit. 

Elasticsearch

Es wird Elasticsearch 0.20.5 verwendet. Zum Betrieb der Suche werden keine Plugins benötigt. Das elasticsearch-head-plugin ist jedoch hilfreich, um den Zustand des Indexes zu überprüfen. 

Such-Oberfläche

Die Grailsanwendung verwendet eine geringfügig angepasste Variante von FacetView als Oberfläche. Um die für den Suchbegriff relevanten Textausschnitte anzeigen zu können, werden die Suchanfragen von Facetview nicht direkt an Elasticsearch gesendet, sondern zuvor von der Grailsanwendung weiter verarbeitet.


Die Anwendung besitzt keine Domainklassen und benötigt auch keine Datenbank. Da keine Domainklassen indexiert werden und der Elasticsearchserver eigenständig läuft, wurde auf die Verwendung des grails elasticsearch pluginsverzichtet. Stattdessen werden erneut TransportClients verwendet. Um die Anzahl der erzeugten Clients zu reduzieren und sicherzustellen, dass sie korrekt geschlossen werden, werden die Clients in einem Pool verwaltet. Daneben wurde die Möglichkeit, die Dokumente direkt herunterzuladen, geschaffen. Die Anwendung läuft auf einem Tomcat-Server.

 

Fazit

ManifoldCF eignet sich sehr gut zum Indexieren von Dokumenten aus unterschiedlichen Quellen, jedoch gibt es spezielle Anwendungsfälle, in denen es ineffizient ist, das gesamte Quellsystem zu durchlaufen, um geänderte Dokumente zu finden. In diesen Fällen kann die Performance von ManifoldCF nicht mit einer Anwendung mithalten, die die Eigenheiten dieses Quellsystems, in dem hier beschriebenen Fall SVN, ausnutzt. Es wäre auch möglich, diese Optimierungen in ManifoldCF zu integrieren, indem man einen eigenen, sogenannten RepositoryConnector für SVN schreibt, der Dokumente aus dem Quellsystem bereitstellt. Dazu besteht jedoch in diesem Anwendungsfall keine Notwendigkeit. 
ManifoldCF ist, abgesehen von einigen Kleinigkeiten, leicht zu konfigurieren und die Geschwindigkeit beim Aktualisieren des Indexes ist sehr zufriedenstellend. 
Über die Qualitäten von Grails, FacetView und Elasticsearch wurde im exensio-Blog bereits berichtet.

Kategorien: Apache TomcatElasticsearchIT-ConsultingSuche

Zurück