[[Vorlage(Archiviert,)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Editor: Einen Editor öffnen] [:sudo: Root-Rechte] }}} [[Inhaltsverzeichnis(2)]] [http://sphinxsearch.com/ SQL Phrase Index] {en} (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. = Installation = Folgende Pakete müssen installiert [1] werden: {{{#!vorlage Paketinstallation sphinxsearch, universe }}} = Konfiguration= 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. == Konfiguration einer Quelle == 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: {{{#!vorlage Tabelle <-3 tablestyle="width: 97%;" rowclass="titel">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. {{{#!code 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 } }}} == Konfiguration eines Index == 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. {{{#!code 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 } }}} == Weitere Konfigurationen == {{{#!vorlage warnung Die in der Standardkonfiguration vorhandenen Abschnitte `indexer settings` und `searchd settings` sollten Anfänger nicht ändern. }}} === Den Index anlegen === Die Grundkonfiguration ist nun abgeschlossen. Jetzt kann man mittels des Programmes `indexer` den Suchindex anlegen[3]. {{{#!vorlage Befehl 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 Search-Daemon searchd === 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] {{{#!code # 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 }}} = Testen der Konfiguration = Nun ist der Suchindex bereit und man kann mit der Suche beginnen. {{{#!vorlage Befehl 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. = Weitere Möglichkeiten = * 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. = Links = * [wikipedia:SQL_Phrase_Index: SQL Phrase Index bei Wikipedia] * [http://www.ibm.com/developerworks/library/os-php-sphinxsearch/ Sphinx einrichten und eigene PHP Suchengine entwickeln] {en} * [http://www.howtoforge.com/sphinx-as-mysql-storage-engine-sphinxse MySQL Storage Engine für Sphinx installieren] {en} #tag: Server, Programmierung, Datenbank