Ferret: Lucene-Nachfolger für Ruby

Wer Besuchern seiner Website Information komfortabel anbieten will, braucht Google - oder eine eigene Suchmaschine. Im Ruby-on-Rails-Umfeld gilt Ferret als die schnellste.

vorlesen Druckansicht
Lesezeit: 15 Min.
Von
  • Benjamin Krause
  • Mathias Meyer
Inhaltsverzeichnis

Seine Ursprünge hat Ferret im Apache-Projekt Lucene, einer in der Java-Welt verbreiteten Suchmaschine. Im Jahre 2005 hat der Australier David Balmain das Ferret-Projekt initiiert; es hat seitdem mehrere komplette Überarbeitungen erfahren. Zunächst war Ferret als reiner Lucene-Klon konzipiert, mit kompatiblen Indizes, sodass es möglich war, Ferret- und Lucene-basierte Projekte gleichzeitig auf einen Suchindex zugreifen zu lassen. Mit der Portierung auf C verabschiedete sich Ferret jedoch von der Kompatibilität, was Performance-Schübe mit sich brachte, vor allem bei der Indizierung (siehe Naïve suffix array search engine vs. Ferret vs. Lucene).

Die Installation von Ferret erfolgt über Rubys Paket-Werkzeug Gems (sudo gem install ferret), setzt allerdings aufgrund der C-Erweiterungen einen installierten Compiler voraus. Zur Fertigstellung dieses Artikels dürfte Version 0.11.4 vorliegen, die als Release-Kandidat für die Version 1.0 gilt und weitgehend stabil läuft.

Voraussetzung für eine funktionierende Suche ist ein Index. Den erstellt die Klasse Ferret::Index::Index. Ein Codebeispiel zeigt die Funktionsweise:

$ irb -rubygems
>> require 'ferret'
>> index = Ferret::Index::Index.new
>> index << 'The Curse of the Were-Rabbit'
>> index << 'The Curse of the Black Pearl'

Jede dem Index hinzugefügte Zeile stellt für Ferret ein Dokument dar – gleichgültig, ob es sich um eine Sammlung von Strings, ein Word-Dokument oder eine MP3-Datei handelt. Implementiert ist die Funktion in der Klasse Ferret::Document. Intern basiert ein Dokument auf einem Hash, der aus Feldnamen (key) und Feldwerten (value) besteht. Ein Name ist ein Symbol, der Wert ein String oder ein String-Array. Felder lassen sich um Angaben ergänzen, etwa um dem fraglichen Feld eine höhere Präzedenz bei der Suche zu geben. Obiger Code enthält keinen Feldnamen, in diesem Fall verwendet Ferret das Feld :id.

Mehr Infos

Listing 1

>> index << { :title => 'The Curse of the Black Pearl', 
:tags => %w{ film pirates carribean } }
>> index << { :title => 'The Curse of the Were-Rabbit',
:tags => %w{ film wallace gromit rabbit animated } }