Sphinx ist eine Volltextsuchmaschine, die vom Russen Andrew Aksyonoff entwickelt wurde. Es soll schnelle, platzsparende und ergebnisrelevante Volltextsuchfunktionen für andere Anwendungen bereitstellen. Sphinx lässt sich problemlos in SQL-Datenbanken und Skriptsprachen integrieren. Das aktuelle System verfügt über integrierte Unterstützung für MySQL- und PostgreSQL-Datenbankdatenquellen und unterstützt auch das Lesen von XML-Daten in einem bestimmten Format aus der Standardeingabe.
Die Funktionen von Sphinx sind wie folgt:
a) Hochgeschwindigkeitsindizierung (auf modernen CPUs kann die Spitzenleistung 10 MB/Sekunde erreichen);
b) Hochleistungssuche (bei 2–4 GB Textdaten beträgt die durchschnittliche Antwortzeit pro Abruf weniger als 0,1 Sekunden);
c) Kann große Datenmengen verarbeiten (derzeit). bekanntermaßen in der Lage, mehr als 100 GB Textdaten zu verarbeiten, 100 Millionen Dokumente können auf einem einzigen CPU-System verarbeitet werden);
d) Bietet einen hervorragenden Relevanzalgorithmus, eine zusammengesetzte Ranking-Methode basierend auf Phrasenähnlichkeit und Statistiken (BM25);
e) Unterstützt verteilte Suche;
f) Unterstützt Phrasensuche
g) Bietet Dokumentzusammenfassungsgenerierung
h) Kann sein bereitgestellt als MySQL-Speicher-Engine-Suchdienst;
i) Unterstützt mehrere Suchmodi wie Boolesch, Phrase, Wortähnlichkeit usw.;
j) Dokument unterstützt mehrere Volltextsuchfelder ( maximal 32);
k) Dokument unterstützt mehrere zusätzliche Attributinformationen (wie Gruppierungsinformationen, Zeitstempel usw.);
l) Unterstützt Wortsegmentierung; >
Obwohl MYISAM von MySQL eine Volltextindizierung bietet, ist die Leistung nicht sehr gut. Darüber hinaus müssen wir diese Aufgaben geeigneten Programmen überlassen der Druck auf die Datenbank. Daher ist die Verwendung von Sphinx als Volltext-Indexierungstool für MySQL eine gute Wahl. Diese Woche werde ich hauptsächlich lernen, wie man dieses Tool verwendet. Ich werde den Lernprozess kurz aufzeichnen und ein Memo erstellen. Ich hoffe, es kann andere Freunde inspirieren, die dieses Tool lernen.
Sphinx installieren
wget http://sphinxsearch.com/files/sphinx-2.2.11-release.tar.gz tar -xf sphinx-2.2.11-release.tar.gz && cd sphinx-2.2.11-release ./configure --prefix=/usr/local/spinx --with-mysql make && make install ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/ libsphinxclient 安装(PHP模块需要) cd api/libsphinxclient ./configure –prefix=/usr/local/sphinx make && make install
wget http://pecl.php.net/get/sphinx-1.3.0.tgz tar zxf sphinx-1.3.3.tgz && cd sphinx-1.3.3 ./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx=/usr/local/sphinx/ make && make install
3. Konfigurationsdatei erstellen
cp /usr/local/sphinx/etc/sphinx-min.conf.dist /usr/local/sphinx/etc/sphinx.conf
# # Minimal Sphinx configuration sample (clean, simple, functional) # source src1 { type = mysql sql_host = localhost sql_user = root sql_pass = www.123 sql_db = test sql_port = 3306 # optional, default is 3306 sql_query = \ SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \ FROM documents sql_attr_uint = group_id sql_attr_timestamp = date_added } index test1 { source = src1 path = /usr/local/spinx/var/data/test1 } indexer { mem_limit = 32M } searchd { listen = 9312 listen = 9306:mysql41 log = /usr/local/spinx/var/log/searchd.log query_log = /usr/local/spinx/var/log/query.log read_timeout = 5 max_children = 30 pid_file = /usr/local/spinx/var/log/searchd.pid seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 workers = threads # for RT to work binlog_path = /usr/local/spinx/var/data }
4. Index erstellen und starten
/usr/local/spinx/bin/indexer -c /usr/local/spinx/etc/sphinx.conf --all /usr/local/spinx/bin/searchd -c /usr/local/spinx/etc/sphinx.conf
cd /root/sphinx-2.2.11-release/api python test.py test DEPRECATED: Do not call this method or, even better, use SphinxQL instead of an API Query 'test ' retrieved 3 of 3 matches in 0.000 sec Query stats: 'test' found 5 times in 3 documents Matches: 1. doc_id=1, weight=2, group_id=1, date_added=2016-11-30 01:21:20 2. doc_id=2, weight=2, group_id=1, date_added=2016-11-30 01:21:20 3. doc_id=4, weight=1, group_id=2, date_added=2016-11-30 01:21:20
mysql> select * from documents; +----+----------+-----------+---------------------+-----------------+---------------------------------------------------------------------------+ | id | group_id | group_id2 | date_added | title | content | +----+----------+-----------+---------------------+-----------------+---------------------------------------------------------------------------+ | 1 | 1 | 5 | 2016-11-30 01:21:20 | test one | this is my test document number one. also checking search within phrases. | | 2 | 1 | 6 | 2016-11-30 01:21:20 | test two | this is my test document number two | | 3 | 2 | 7 | 2016-11-30 01:21:20 | another doc | this is another group | | 4 | 2 | 8 | 2016-11-30 01:21:20 | doc number four | this is to test groups | +----+----------+-----------+---------------------+-----------------+---------------------------------------------------------------------------+