Ubuntu 12.04 Precise Pangolin
SQL Phrase Index (Abk. Sphinx) ist eine Open Source (GPL2) Volltextsuchmaschine. In der Suchmaschine enthalten sind ein Indexer, ein Suchdaemon und ein Kommandozeilen-Suchtool. Es gibt unter anderem APIs für Perl, Python, PHP und Ruby. Auch für MySQL ist eine Storage Engine (SphinxSE) verfügbar, mit der man die Vorteile einer schnellen Suche mit denen einer MySQL-Tabelle vereinen kann. Seine Hauptvorteile spielt Sphinx bei der Implementierung von eigenen Such-Engines für Programme oder Webapplikationen aus, die große Datenmengen in kurzer Zeit verarbeiten müssen. Dieser Artikel bietet eine Einführung in Sphinx und seine Grundkonfiguration. Der erweiterte Umgang sowie die Verwendung der APIs oder der Storage-Engine wird nicht weiter behandelt.
Folgende Pakete müssen installiert [1] werden:
sphinxsearch (universe)
mit apturl
Paketliste zum Kopieren:
sudo apt-get install sphinxsearch
sudo aptitude install sphinxsearch
Sphinx wird durch die Datei /etc/sphinxsearch/sphinx.conf konfiguriert[2][3]. Als Minimum müssen eine Datenquelle und ein Index eingerichtet werden, um die Suchmaschine zu verwenden.
Um einen Index anlegen zu können, benötigt Sphinx eine Quelle. In diesem Beispiel wird eine MySQL-Datenbank als Datenquelle verwendet. Die DB-Tabelle enthält Nachrichten für ein bestimmtes Thema und sieht so aus:
News | ||
Name | Typ | Merkmal |
id | INTEGER | PRIMARY, AUTO_INCREMENT |
headline | VARCHAR | - |
publicationDate | DATETIME | - |
text | VARCHAR | - |
author | INTEGER | FOREIGN KEY |
Um einen Index zu erstellen, benötigt Sphinx zwingend einen 32-Bit-Integer-Wert als ID. Dafür prädestiniert ist der Primärschlüssel aus obiger Tabelle. Da Sphinx eine Volltextsuche darstellt, braucht man natürlich auch Textinhalte, die für die Suche indiziert werden sollen. In diesem Falle können die Felder headline
und text
dafür verwendet werden. Die übrigen Felder werden später sogenannte Attribute, nach denen Sphinx weiter sortieren und gruppieren kann.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | source Quellenname { type = mysql sql_host = localhost sql_user = USERNAME sql_pass = PASSWORD sql_db = DATENBANKNAME # sql_port = 3306 # Die folgende SQL-Query wird von Sphinx benutzt, um den Index zu erstellen. # Hier werden also alle gewünschten Felder angegeben, die in der späteren Suche berücksichtigt # werden sollen. sql_query = SELECT id, headline, UNIX_TIMESTAMP(publicationDate), text, author \ FROM news # Hier werden die sogenannten Attribute definiert. Diese werden nicht mit in die Volltextsuche einbezogen, # ermöglichen es aber, weiter nach diesen Feldern zu sortieren (zB. nach Autor) sql_attr_uint = author sql_attr_timestamp = publicationDate # Diese SQL-Query bestimmt die Ausgabe des Kommandozeilentools zur Suche. # $id ist ein Makro und wird durch die IDs ersetzt, die zum Suchergebnis passen. sql_query_info = SELECT headline, publicationDate, text FROM news WHERE id=$id } |
Hier wird nun der eigentliche Index konfiguriert. Der Index wird auf der Festplatte abgelegt und stellt die Datenbasis der Suche dar. Indiziert werden nur die Felder, die vom Typ her Text enthalten. Alle anderen Attribute können nicht indiziert werden. Je nach Konfiguration werden die Attribute mit dem Index in eine Datei geschrieben oder in einer externen Datei vorgehalten. Der Vorteil der externen Speicherung ist, dass durch Cachen der Attribute im RAM die Suche bei großen Indizes schneller ist.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | index Indexname { # Jeder Index benötigt mindestens eine Datenquelle. Werden mehrere Datenquellen angegeben, so werden sie nacheinander indiziert. source = Quellenname source = weiterer Quellenname # Der Index wird an diesem Ort gespeichert werden. Dieser Pfad muss existieren. path = /var/lib/sphinxsearch/data/NewsIndex # Die Attribute werden hier extern gespeichert, um die bestmögliche Geschwindigkeit zu erzielen docinfo = extern # Hier kann angegeben werden wie lang das Suchwort minimal sein muss. min_word_len = 2 # Zuletzt noch den Zeichensatz festlegen. charset_type = utf-8 } |
Die in der Standardkonfiguration vorhandenen Abschnitte indexer settings
und searchd settings
sollten Anfänger nicht ändern.
Die Grundkonfiguration ist nun abgeschlossen. Jetzt kann man mittels des Programmes indexer
den Suchindex anlegen[3].
sudo indexer --all
Durch diesen Befehl werden nun alle Indizes angelegt. Die Ausgabe könnte in etwa so aussehen:
Sphinx 0.9.9-release (r2117) Copyright (c) 2001-2009, Andrew Aksyonoff using config file '/etc/sphinxsearch/sphinx.conf'... indexing index 'news'... collected 123294 docs, 8.4 MB sorted 1.1 Mhits, 100.0% done total 123294 docs, 8439361 bytes total 3.738 sec, 2257163 bytes/sec, 32975.80 docs/sec total 2 reads, 0.052 sec, 4780.4 kb/call avg, 26.1 msec/call avg total 24 writes, 0.077 sec, 969.1 kb/call avg, 3.2 msec/call avg
Der Suchdienst ermöglicht es APIs, Sphinx zu benutzen, um die Suche z.B. aus PHP oder Ruby-Skripten zu verwenden. Für einige Sprachen gibt es schon vorgefertigte APIs. Um den Suchdaemon zum Systemstart zu laden, muss die Datei /etc/default/sphinxsearch bearbeitet und der Parameter START
auf yes
gesetzt werden.[3]
1 2 3 4 | # Should sphinxsearch run automatically on startup? (default: no) # Before doing this you might want to modify /etc/sphinxsearch/sphinx.conf # so that it works for you. START=yes |
Nun ist der Suchindex bereit und man kann mit der Suche beginnen.
search Suchbegriff
Bei der Suche nach dem Suchbegriff werden nun alle Ergebnisse so angezeigt, wie sie oben in der Datenquelle durch sql_query_info
definiert wurden.
Sphinx bietet viele Möglichkeiten, die Suche einzugrenzen und die Ergebnisse zu sortieren und zu gruppieren.
Mit der SphinxSE, einer MySQL Storage Engine, lässt sich die Suche auch über MySQL steuern. Dadurch benötigt man für andere Sprachen auch keine eigene API mehr
Um die vollen Möglichkeiten von Sphinx auszuschöpfen, empfiehlt es sich, die Dokumentation zu lesen.
Diese Revision wurde am 24. Mai 2015 20:17 von cornix erstellt.