Sphinx-Search Engine mit MySQL unter Ubuntu
Sphinx ist ein extrem interessanter Ansatz für alle, denen die Volltextsuche von MySQL zu eingeschränkt ist. Hier erkläre ich, wie man Sphinx unter Ubuntu zum Laufen bekommt.
Edit: weitere/neuere Infos
Quellcode herunterladen, kompilieren und installieren
(Anmerkung: Die Versionsnummer können sich in der Zwischenzeit natürlich geändert haben – diese also beachten)
Zuerst brauchen wir den Quellcode, da dieser leider (noch?) nicht als Ubuntu-Paket verfügbar ist:
cd /usr/src
sudo wget www.sphinxsearch.com/downloads/sphinx-0.9.7-rc2.tar.gz
sudo tar xzf sphinx-0.9.7-rc2.tar.gz
Um das Ganze zu kompilieren, brauchen wir GNU make und gcc. Beide sind über ein Sammelpaket herunterladbar. Außerdem bemötigen wir für die SQL-Unterstützung das dev-Paket des MySQL-Clients:
sudo apt-get install build-essential libmysqlclient15-dev
Nun sollte die Installation recht einfach funktionieren:
cd /usr/src/sphinx-0.9.7-rc2
./configure
make
make install
Die Dateien wurden nach /usr/local/ geschrieben. Um Sphinx nun effektiv zu nutzen muss man folgende Schritte unternehmen.
Sphinx unter Ubuntu konfigurieren
Zuerst einmal muss man die Konfigdatei anpassen – hier kann ich wenig helfen, aber die Vorlage ist recht verständlich und man kommt mit ein wenig Experimentieren schnell zurecht. Man sollte die Vorlage kopieren und diese anpassen:
sudo cp /usr/local/etc/sphinx.conf.dist /usr/local/etc/sphinx.conf
sudo gedit /usr/local/etc/sphinx.conf
Um Sphinx als Dienst laufen zu lassen, kann man eine init-Datei herunterladen, die ich vorbereitet habe und dise ins init.d-Verzeichnis legen:
wget www.auxnet.de/fileadmin/data/blog/searchd.gz
gunzip searchd.gz
sudo chown root.root searchd
sudo chmod 755 searchd
sudo mv searchd /etc/init.d/
Den Dienst kann man nun mit Hilfe von folgendem Kommando starten:
sudo /etc/init.d/searchd start
Vor dem Start habe ich eine Reindizierung eingebaut, damit der Dienst auch startet, falls keine Index-Dateien vorliegen. Dieses Verhalten kann man natürlich anpassen (im Skript).
Will man, dass Sphinx standardmäßig beim Systemstart startet, kann man das mit Hilfe der Runlevels einfach machen:
sudo update-rc.d searchd start 92 2 3 4 5 . stop 08 S 1 6 .
(S92 habe ich genommen, so dass der Dienst direkt nach Apache startet…)
MySQL Storage Engine nutzen (optional)
Man kann Sphinx auch als Storage Engine für MySQL nutzen. Dies ist dann interessant, wenn man z.B. mit JOINS die gefundenen Daten mit den Texten verknüpfen will, o.ä. Wer Sphinx extern (z.B. über die PHP-API) nutzt, benötigt diesen Schritt nicht extra.
Um das Ganze zum Laufen zu bringen, braucht man den Quellcode von MySQL und ein wenig Geduld…
Zuerst brauchen wir die Voraussetzungen zum Kompilieren von MySQL – nicht gerade wenig:
sudo apt-get install libtool debhelper libncurses5-dev libwrap0-dev \
zlib1g-dev libreadline-dev chrpath automake1.8 automake1.9 \
doxygen dpatch procps file perl psmisc po-debconf tetex-bin \
tetex-base tetex-extra gs gawk bison
(Bison ist hier wichtig, da Sphinx das zum Kompilieren benötigt, sonst bricht die Installation mit einem Fehler ab!)
Nun holen wir uns die Sources des mysql-servers (Sources müssen natürlich in /etc/apt/sources.list eingetragen sein):
sudo apt-get source mysql-server
Ok, diese müssen wir nun patchen:
cd mysql-dfsg-5.0-5.0.24a
sudo patch -p1 < ../sphinx-0.9.7-rc2/mysqlse/sphinx.5.0.22.diff
Der Patch sollte glatt laufen, bis auf eine Stelle - diese müssen wir per Hand nachtragen:
sudo gedit sql/set_var.cc
Hier nach “csv” suchen und nach dieser Zeile folgende einfügen:
{"have_sphinx", (char*) &have_sphinx_db, SHOW_HAVE},
Nun den Storage Engine Quellcode kopieren:
sudo cp -ar ../sphinx-0.9.7-rc2/mysqlse sql/sphinx
Jetzt haben wir’s fast – nur noch dpkg sagen, dass wir den Storage Engine mitkompilieren wollen:
sudo gedit nano debian/rules
Hier nach “with-innodb” suchen und nach dieser Zeile folgende einfügen:
--with-sphinx-storage-engine \
Jetzt ist alles bereit… gestartet wird die Installation mit:
sudo dpkg-buildpackage
Ok, jetzt sollte alles fehlerfrei durchlaufen – das Kompilieren dauert auch auf einem modernen Dual-Core-Rechner eine Weile. Man kann also einen schnellen Kaffee trinken gehen :-)
Wenn alles glatt gelaufen ist dann zurück in’s /etc/src-Verzeichnis und das Paket installieren:
cd ..
sudo dpkg -i mysql-server-5.0_5.0.24a-9_i386.deb
Falls man MySQL noch nicht installiert hat, muss man evt. noch andere Pakete mitinstallieren, die ebenfalls im /usr/src-Verzeichnis zu finden sind…
Ob alles geklappt hat, sieht man, wenn man sich mit mysql einloggt und folgenden Befehl ausführt:
SHOW ENGINES;
Es müsste dann eine Zeile mit SPHINX und Support YES kommen.
Viel Spaß damit!
- Trackback
sphinx-search configuration (ubuntu)
[...] Original post [...]...
- 13 Kommentare
Allgemeine Anleitung für Sphinx
Weniger auf Ubuntu abgestimmte aber ebenfalls deteilreiche Anleitung für Installation, Konfiguration und Betrieb gibt es bei mir (http://robert.kolatzek.org/blog/article.php/Sphinx_Search_Engine_Installation_Konfig). Dein Artikel war meine Inspiration.
instructions
Hallo Max…
…und danke viel fur dieses “instructions”. Mein Deutsch is uber-haupt-schelcht, aber ich verstehe’s alles.
Yets die ubuntu source code von mysql ist 5.0.51, und das “patch” functioniert nich: und sphinx hat kein “patch” fur 5.0.51.
:-D
OK, ich wurde ein andere solution finden…
Danke und tchuss!
Charles der franzose
Versionen...
Danke Charles,
es sollte auch mit einer älteren Version funktionieren – Sphinx 0.9.8-rc2 läuft bei mit unter MySQL 5.0.51a. Die MySQL-API hat sich nicht wesentlich verändert, denke ich…
Viele Grüße,
Max.
mysql_5.0-5.0.24a
Ah Max, Ich habe ein website finden mit das mysql_5.0-5.0.24a archiv:
Vor das patch konnen sie hier die archiven finden:
# wget https://launchpad.net/ubuntu/edgy/+source/mysql-dfsg-5.0/5.0.24a-9/+files/mysql-dfsg-5.0_5.0.24a-9.dsc
# wget https://launchpad.net/ubuntu/edgy/+source/mysql-dfsg-5.0/5.0.24a-9/+files/mysql-dfsg-5.0_5.0.24a-9.diff.gz
# wget https://launchpad.net/ubuntu/edgy/+source/mysql-dfsg-5.0/5.0.24a-9/+files/mysql-dfsg-5.0_5.0.24a.orig.tar.gz
und dann de-package das source:
# dpkg-source -x mysql-dfsg-5.0_5.0.24a-9.dsc
Dann fahren Sie mit Ihrer soluzion (patch etc…)
Aber mit der package habe ich einer feller:
dpkg-shlibdeps: failure: couldn’t find library libndbclient.so.0 needed by debian/mysql-server-5.0/usr/sbin/ndb_mgmd (its RPATH is ”).
Note: libraries are not searched in other binary packages that do not have any shlibs or symbols file.
To help dpkg-shlibdeps find private libraries, you might need to set LD_LIBRARY_PATH.
dh_shlibdeps: command returned error code 512
make: *** [binary-arch] Error 1
dpkg-buildpackage: failure: debian/rules binary gave error exit status 2
hum… habe ich noch einige arbeit zum tun.
Charles der franzose
Debian-Paket für Sphinx
Unter http://www.auxnet.de/blog/blog-post/2008/07/31/sphinx-search-engine-in-ubuntu-mit-hilfe-von-launchpad-installieren.html steht jetzt, wie man Sphinx als deb-Paket installieren kann.
Debian-Paket
Auf der Sphinx-Seite selbst steht ein Artikel, wie man den Search Engine in ein Debian-Paket packt.
http://sphinxsearch.com/wiki/doku.php?id=sphinx_on_debian_gnu_linux
Max.
Git-Repository für Debian-Sphinx
Man kann sphinx auch mit Hilfe von git debianisieren. Das Projekt befindet sich unter: http://github.com/johnl/deb-sphinx-search/
Eine kleine Anleitung zum Installieren findet man am Ende der folgenden Wiki-Seite:
http://wiki.github.com/mkalus/histcross/installing-histcross-on-linux
Neue URL des alten Artikels
Hallo zusammen!
Hier ist die neue URL:
http://robert.kolatzek.org/wblog/34/sphinx-search-engine-installation-und-betrieb-eine-einleitung
Habe bei der Umstellung leider nicht an Backlinks gedacht...
Re: Neue URL des alten Artikels
Danke für die Nennung! Guter Beitrag übrigens :-)
Mx.
searchd.gz
Hi,
dein Link zur searchd.gz funktioniert leider nicht mehr.
Gruß, Sebastian
Link zu searchd.gz
Hallo Sebastian,
danke für den Hinweis. Ich habe den Link korrigiert.
Max.
Beispiele
Hallo. Ich werde aus den Beispielen von Sphinx nicht schlau. Die Dokumentation ist auch verwirrend (ebendso die configs).
Wie nun erstelle ich mein eigenes "Suchscript" mittels PHP?
Es gibt nirgendwo richtige beschreibungen dafür, nur die englsiche doku.
Was ich möchte: Ich habe eine Nutzertabelle die ich gerne auslesen möchte und halt eine benutzersuche realisieren. Man merke sich, diese hat 7 Mio Namen, bei MATCH bzw LIKE dauerts bei MySQL viel zu lange - Deswegen wollte ich Sphinx ausprobieren.
Wie kann ich nun eine Tabelle mittels Sphinx auslesen?
Beispielformat: SELECT id, nickname, seite FROM benutzer WHERE nickname LIKE '%girl%'. Wie bekomme ich das hin?
Reicht es einfach, die statements so beizubehalten und nur als MySQL Engine Sphinx zu wählen`?
Re: Beispiele
Nun ja, du wirst nicht umhin kommen, die Config und die Doku genau zu studieren. Sphinx ist eine externe Suchmaschine. Du musst die Daten zuerst von Sphinx indizieren lassen. Dazu benötigst du die Konfiguration und den Indexer. Erst dann kannst du die Daten mit Hilfe einer API per PHP auslesen. Du bekommst die Treffer und die Ids zurück, die du dann per Datenbank-Queries wiederum mit den "Originaldaten" verlinken kannst.
Externe Suchmaschinen sind eben leider nicht mit einfachen Datenbankabfragen zu vergleichen - du fragst die Daten über eine eigene Schnittstelle ab.
Ich hoffe das hilft ein wenig weiter,
Max.