Open Source im professionellen Einsatz
Linux-Magazin 04/2014
© Ivan Kmit, 123RF.com

© Ivan Kmit, 123RF.com

Big-Data-Suchmaschine für Strings sowie Fotos mit Umkreissuche

Elastische Treffer

Die auf Apache Lucene basierende Volltext-Suchengine Elasticsearch findet zügig Ausdrücke selbst in enorm großen Textsammlungen. Anhand eines Referenzbildes wühlt sie mit ein paar Tricks sogar Fotos aus der Kiste, die jemand in der Gegend geschossen hat.

766

Auf der Suche nach einer Suchmaschine zum schnellen Durchforsten von Logdateien stieß ich neulich auf Elasticsearch [2], eine auf Apache Lucene basierende Volltextsuche mit allerhand Extras. Auf der Downloadseite bietet das Open-Source-Projekt neben dem üblichen Tarball auch ein Debian-Paket an. Die bei Redaktionsschluss aktuelle Pre-Release-Version 1.0.0.RC2 findet mit »sudo dpkg --install *.deb« ohne Probleme den Weg in jedes Ubuntu. Praktischerweise liegt dem Debian-Paket ein Bootskript bei, mit dem Root von der Kommandozeile per

# /etc/init.d/elasticsearch start

den Elasticsearch-Server auf dem voreingestellten Port 9200 in Gang setzt.

Online PLUS

In einem Screencast demonstriert Michael Schilli das Beispiel: http://www.linux-magazin.de/2014/04/plus

Polyglott oder Perl

Die meisten Praxis-Tutorials aus dem Web nutzen die REST-Schnittstelle, um mit dem Server über HTTP zu kommunizieren. Abbildung 1 zeigt einen »GET« -Request auf den laufenden Server, der den Status anzeigt.

Zum Einfüttern von Daten und fürs spätere Abfragen gibt es eine Reihe von REST-Clients in mehreren Sprachen. Offizieller Perl-Client darf sich das CPAN-Modul Elasticsearch nennen. Zu beachten ist allerdings, dass Elasticsearch (aktuelle Version 1.03, [3]) der Nachfolger des veralteten Moduls »ElasticSearch« (großes S, [4]) ist. Zweifellos eine äußerst unglückliche Namenswahl des CPAN-Autors, schon allein weil die alte Version auf dem CPAN liegen geblieben ist und bei Suchabfragen auf http://search.cpan.org vor der neuen hochploppt.

Als nutzbringende Beispielanwendung für eine Elasticsearch-Volltextsuche identifiziere ich die Stichwortsuche in allen bislang im Linux-Magazin erschienenen Perl-Snapshots. Die Manuskripte der über 200 Artikel dieser Reihe finden sich in einem Git-Repository unter meinem Homeverzeichnis, das Skript in Listing 1 übermittelt alle rekursiv gefundenen Textdateien über die REST-Schnittstelle an den laufenden Elasticsearch-Server zur Indizierung. Der Aufruf

$ fs-index ~/git/articles

dauerte erst einige Minuten, ein zweiter Aufruf mit angewärmtem Plattencache lief dann innerhalb von 30 Sekunden durch. Eine anschließende Suche nach dem Wort "Balkon" zeigt Ergebnisse in Bruchteilen einer Sekunde:

$ fs-search balkon
/home/mschilli/git/articles/water/t.pnd
/home/mschilli/git/articles/gimp/t.pnd

Die im Index gefundenen Dateien offenbaren, dass ich das Wort "Balkon" bislang nur in zwei Ausgaben verwendet habe: Einmal im Juli 2008 in einem Artikel über Perls Schnittstelle zum Foto-Editor Gimp, der ein von meinem Balkon aus geschossenes Foto manipulierte [5], und einmal im März 2007, als der Perl-Snapshot die automatische Bewässerungsanlage für meine Balkonpflanzen ins gleißende Licht der Öffentlichkeit rückte [6].

Abbildung 1: Nach dem Starten des Daemon antwortet dieser auf dem Port 9200 auf API-Anfragen.

Listing 1

fs-index

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Elasticsearch;
04 use File::Find;
05 use Sysadm::Install qw( slurp );
06
07 my $idx = "fs";
08
09 my( $base ) = @ARGV;
10 die "usage: $0 basedir" if !defined $base;
11
12 my $es = Elasticsearch->new( );
13 eval { $es->indices->delete( index => $idx ) };
14
15 find sub {
16   my $file = $File::Find::name;
17   return if ! -f $file;
18   return if ! -T $file;
19   return if -s $file > 100_000;
20   my $content = slurp $file;
21
22   $es->index(
23     index => $idx,
24     type  => 'text',
25     body  => {
26       content => $content,
27       file    => $file,
28     }
29   );
30   print "Added $file\n";
31 }, $base;

Stets unscharfe Suche per Stemming

Es zeigt sich weiter, dass Elasticsearch Groß- und Kleinschreibung ignoriert und von sich aus Begriffe einer Stammform-Reduktion unterzieht (Stemming): Eine Suche nach "Pflanze" liefert nämlich die gleichen Ergebnisse wie oben, obwohl in den Textdateien ausschließlich von "Balkonpflanzen" die Rede ist. Allerdings begreift das Analysetool nicht, dass "Balkone" die Mehrzahl von "Balkon" ist, und liefert in diesem Fall keine Treffer. Leider treibt es Elasticsearch manchmal zu weit mit der unscharfen Suche und präsentiert Fundstücke, die keine sind, weil Wörter mit der gleichen Zeichenfolge beginnen. Abgesehen davon findet die Suchfunktion jede Nadel im Heuhaufen, und das zügig.

Das »fs-index« -Skript in Listing 1 nimmt in Zeile 9 das ihm von der Kommandozeile übergebene Suchverzeichnis entgegen und ruft den Konstruktor der Klasse »Elasticsearch« auf. Falls Suchabfragen einmal nicht das gewünschte Ergebnis bringen, lässt sich der Konstruktor mit

my $es = Elasticsearch->new(
    trace_to => ['File','log']
);

dazu überreden, in der Logdatei »log« alle an den Elasticsearch-Server abgesetzten Befehle im Curl-Format auszuspucken. Per Cut&Paste kann der davon überraschte Entwickler den Vorgang Schritt für Schritt nachvollziehen.

Elasticsearch speichert die Daten einer Applikation unter einem Index, den die Zeile 7 mit »fs« (wie File System) benennt. Falls schon Daten vorliegen, löscht die Methode »delete()« ihn in Zeile 13. Die umwickelnde »eval« -Anweisung fängt etwaige Fehler stillschweigend ab, beispielsweise wenn der Index noch gar nicht existiert, weil es sich um den allerersten Aufruf von »fs-index« handelt.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Perl-Snapshot

    Websites bieten ihren Lesern zu einem Thema oft auch noch Links zu Artikeln mit ähnlichen Themen an. Die freie Suchmaschine Elasticsearch findet diese blitzschnell und automatisch, nachdem sie alle Dokumente aus einem Korpus analysiert und indiziert hat.

  • Perl-Snapshot: Schlaue Recherche mit Elasticsearch

    Websites bieten ihren Lesern zu einem Thema oft auch noch Links zu Artikeln mit ähnlichen Themen an. Die freie Suchmaschine Elasticsearch findet diese blitzschnell und automatisch, nachdem sie alle Dokumente aus einem Korpus analysiert und indiziert hat.

  • ELK-Stack

    Eine leistungsfähige Suchmaschine, ein Tool zum Verarbeiten und Normalisieren von Protokollen und eins zum Visualisieren der Auswertungen – Elasticsearch, Logstash und Kibana bilden den ELK-Stack, der auf Systemen mit großem Log-Aufkommen den Karren aus dem Dreck zieht.

  • Mongo DB integriert ElasticSearch

    Die Firma Compose (früher MongoHQ), spezialisiert darauf, die bekannte NoSQL-Datenbank MongoDB als Service anzubieten, integriert nun das Datenanalyse-Tool ElasticSearch.

  • Elasticsearch 1.0.0 verfeinert seine Suchstrategie

    Die Macher von Elasticsearch bauen auf der Basis von Apaches Suchbibliothek Lucene einen verteilten Echtzeit-Suchserver, der unter der Apache-Lizenz steht. In Version 1.0.0 stecken 8000 Commits von 183 Entwicklern.

comments powered by Disqus

Ausgabe 08/2016

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.