前書き
Sphinxは、全文検索を可能にするオープンソースの検索エンジンです。 大きなデータを非常に効率的に検索することで最もよく知られています。 索引付けされるデータは、通常、SQLデータベース、プレーンテキストファイル、HTMLファイル、メールボックスなど、さまざまなソースから取得されます。
Sphinxの主な機能は次のとおりです。
-
高いインデックス作成と検索のパフォーマンス
-
高度なインデックス作成およびクエリツール
-
高度な結果セットの後処理
-
1秒あたり最大数十億のドキュメント、テラバイトのデータ、数千のクエリまでの実証済みのスケーラビリティ
-
SQLおよびXMLデータソース、SphinxQL、SphinxAPI、またはSphinxSE検索インターフェイスとの簡単な統合
-
分散検索による簡単なスケーリング
このチュートリアルでは、配布パッケージに含まれているサンプルSQLファイルを使用して、MySQLサーバーでSphinxをセットアップします。 プロジェクトでSphinxを使用する方法の基本的なアイデアが得られます。
前提条件
このガイドを始める前に、次のものが必要です。
-
Ubuntu 16.04サーバー1台。
-
https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-ubuntu-16-04 [このチュートリアルに従って設定できるsudo非ルートユーザー]。
-
サーバーにインストールされているMySQL。これは、https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-onのステップ2に従って設定できます。 -ubuntu-16-04#step-2-install-mysql [このチュートリアル]。
ステップ1-Sphinxのインストール
UbuntuにSphinxをインストールするのは簡単です。ネイティブパッケージリポジトリにあるからです。 `+ apt-get`を使用してインストールします。
sudo apt-get install sphinxsearch
これで、サーバーにSphinxが正常にインストールされました。 Sphinxデーモンを開始する前に、構成してみましょう。
ステップ2 –テストデータベースの作成
次に、パッケージで提供されるSQLファイルのサンプルデータを使用してデータベースをセットアップします。 これにより、後でSphinx検索が機能していることをテストできます。
サンプルSQLファイルをデータベースにインポートしましょう。 まず、MySQLサーバーシェルにログインします。
mysql -u root -p
求められたら、MySQL rootユーザーのパスワードを入力します。 プロンプトは `+ mysql> +`に変わります。
ダミーデータベースを作成します。 ここでは、「テスト」と呼んでいますが、好きな名前を付けることができます。
CREATE DATABASE ;
サンプルSQLファイルをインポートします。
SOURCE /etc/sphinxsearch/example.sql;
その後、MySQLシェルを終了します。
quit
これで、サンプルデータで満たされたデータベースができました。 次に、Sphinxの構成をカスタマイズします。
ステップ3 – Sphinxの構成
Sphinxの設定は、 `+ / etc / sphinxsearch `の ` sphinx.conf +`というファイルにある必要があります。 構成は、実行に不可欠な3つのメインブロックで構成されます:* index 、 searchd 、および source *。 使用するためのサンプル設定ファイルを提供し、後でカスタマイズできるように各セクションを説明します。
最初に、 `+ sphinx.conf +`ファイルを作成します。
sudo nano /etc/sphinxsearch/sphinx.conf
これらの* index 、 searchd 、および source *ブロックのそれぞれについて以下に説明します。 次に、このステップの最後に、 `+ sphinx.conf +`全体が含まれており、コピーしてファイルに貼り付けることができます。
-
source *ブロックには、MySQLサーバーへのソース、ユーザー名、およびパスワードのタイプが含まれています。 `+ sql_query +`の最初の列は一意のIDでなければなりません。 SQLクエリはすべてのインデックスで実行され、データをSphinxインデックスファイルにダンプします。 以下は、各フィールドとソースブロック自体の説明です。
-
+ type +
:インデックスを作成するデータソースのタイプ。 この例では、これは* mysql *です。 サポートされている他のタイプには、pgsql、mssql、xmlpipe2、odbcなどがあります。 -
+ sql_host +
:MySQLホストのホスト名。 この例では、これは `+ localhost +`です。 これは、ドメインまたはIPアドレスにすることができます。 -
+ sql_user +
:MySQLログインのユーザー名。 この例では、これは* root *です。 -
+ sql_pass +
:MySQLユーザーのパスワード。 この例では、これはルートMySQLユーザーのパスワードです。 -
+ sql_db +
:データを保存するデータベースの名前。 この例では、これは* test *です。 -
+ sql_query +
:データベースからインデックスにデータをダンプするクエリ。
これはソースブロックです。
sphinx.confのソースブロック
source src1
{
type = mysql
#SQL settings (for ‘mysql’ and ‘pgsql’ types)
sql_host = localhost
sql_user = root
sql_pass = password
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 *コンポーネントには、データを保存するためのソースとパスが含まれています。 + in
-
+ source +
:ソースブロックの名前。 この例では、これは* src1 *です。 -
+ path +
:インデックスを保存するパス。
sphinx.confのインデックスブロック
index test1
{
source = src1
path = /var/lib/sphinxsearch/data/test1
docinfo = extern
}
-
searchd *コンポーネントには、Sphinxデーモンを実行するためのポートおよびその他の変数が含まれています。
-
+ listen +
:Sphinxデーモンが実行するポート、その後にプロトコル。 この例では、これは* 9306:mysql41 *です。 既知のプロトコルは_:sphinx_(SphinxAPI)および_:mysql41_(SphinxQL)です -
+ query_log +
:クエリログを保存するパス。 -
+ pid_file +
:SphinxデーモンのPIDファイルへのパス。 -
+ seamless_rotate +
:大量のデータを含むインデックスをプリキャッシュする際にsearchdストールを防ぎます。 -
+ preopen_indexes +
:起動時にすべてのインデックスを強制的にプリオープンするかどうか。 -
+ unlink_old +
:ローテーションが成功したときに古いインデックスコピーを削除するかどうか。
sphinx.confの検索ブロック
searchd
{
listen = 9312:sphinx #SphinxAPI port
listen = 9306:mysql41 #SphinxQL port
log = /var/log/sphinxsearch/searchd.log
query_log = /var/log/sphinxsearch/query.log
read_timeout = 5
max_children = 30
pid_file = /var/run/sphinxsearch/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
binlog_path = /var/lib/sphinxsearch/data
}
コピーして貼り付けるための完全な構成は次のとおりです。 以下で変更する必要がある唯一の変数は、強調表示されているソースブロック内の `+ sql_pass +`変数です。
完全なsphinx.confファイル
source src1
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = test
sql_port = 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 = /var/lib/sphinxsearch/data/test1
docinfo = extern
}
searchd
{
listen = 9306:mysql41
log = /var/log/sphinxsearch/searchd.log
query_log = /var/log/sphinxsearch/query.log
read_timeout = 5
max_children = 30
pid_file = /var/run/sphinxsearch/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
binlog_path = /var/lib/sphinxsearch/data
}
より多くの設定を調べるには、 `+ / etc / sphinxsearch / sphinx.conf.sample +`ファイルを見てください。このファイルには、すべての変数がさらに詳しく説明されています。
ステップ4-インデックスの管理
このステップでは、Sphinxインデックスにデータを追加し、 `+ cron +`を使用してインデックスが最新であることを確認します。
最初に、前に作成した構成を使用してインデックスにデータを追加します。
sudo indexer --all
次のようなものが表示されるはずです。
OutputSphinx 2.2.9-id64-release (rel22-r5006)
Copyright (c) 2001-2015, Andrew Aksyonoff
Copyright (c) 2008-2015, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file '/etc/sphinxsearch/sphinx.conf'...
indexing index 'test1'...
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.010 sec, 18552 bytes/sec, 384.50 docs/sec
total 4 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
total 12 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
実稼働環境では、インデックスを最新の状態に保つ必要があります。 それを行うには、cronジョブを作成しましょう。 まず、crontabを開きます。
crontab -e
どのテキストエディターを使用するかを尋ねられる場合があります。 好きな方を選択してください。このチュートリアルでは、「+ nano +」を使用しました。
フォローcronjobは1時間ごとに実行され、前に作成した構成ファイルを使用して新しいデータをインデックスに追加します。 ファイルの最後にコピーして貼り付け、ファイルを保存して閉じます。
crontab
@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all
Sphinxが完全にセットアップおよび構成されたので、サービスを開始して試してみることができます。
ステップ5-Sphinxの開始
デフォルトでは、Sphinxデーモンはオフになっています。 最初に、 `+ / etc / default / sphinxsearch `の ` START = no `の行を ` START = yes +`に変更して有効にします。
sudo sed -i 's/START=no/START=yes/g' /etc/default/sphinxsearch
次に、 `+ systemctl +`を使用してSphinxデーモンを再起動します。
sudo systemctl restart sphinxsearch.service
Sphinxデーモンが正しく実行されているかどうかを確認するには、実行します。
sudo systemctl status sphinxsearch.service
次のようなものが表示されるはずです。
Output● sphinxsearch.service - LSB: Fast standalone full-text SQL search engine
Loaded: loaded (/etc/init.d/sphinxsearch; bad; vendor preset: enabled)
Active: active (running) since Tue 2016-07-26 01:50:00 EDT; 15s ago
. . .
これにより、サーバーが再起動されても、Sphinxデーモンが確実に起動します。
ステップ6-テスト
すべてが設定されたので、検索機能をテストしましょう。 MySQLインターフェースを使用して(ポート9306で)SphinxQLに接続します。 プロンプトは `+ mysql> +`に変わります。
mysql -h0 -P9306
文を検索しましょう。
SELECT * FROM test1 WHERE MATCH('test document'); SHOW META;
次のようなものが表示されるはずです。
Output+------+----------+------------+
| id | group_id | date_added |
+------+----------+------------+
| 1 | 1 | 1465979047 |
| 2 | 1 | 1465979047 |
+------+----------+------------+
2 rows in set (0.00 sec)
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| total | 2 |
| total_found | 2 |
| time | 0.000 |
| keyword[0] | test |
| docs[0] | 3 |
| hits[0] | 5 |
| keyword[1] | document |
| docs[1] | 2 |
| hits[1] | 2 |
+---------------+----------+
9 rows in set (0.00 sec)
上記の結果では、Sphinxがテスト文の `+ test1 `インデックスから2つの一致を見つけたことがわかります。 ` SHOW META; +`コマンドは、文のキーワードごとのヒットも表示します。
キーワードを検索してみましょう。
CALL KEYWORDS ('test one three', 'test1', 1);
次のようなものが表示されるはずです。
Output+------+-----------+------------+------+------+
| qpos | tokenized | normalized | docs | hits |
+------+-----------+------------+------+------+
| 1 | test | test | 3 | 5 |
| 2 | one | one | 1 | 2 |
| 3 | three | three | 0 | 0 |
+------+-----------+------------+------+------+
3 rows in set (0.00 sec)
上記の結果では、* test1 *インデックスでSphinxが見つかったことがわかります。
-
キーワード「test」の3つのドキュメントで5つの一致
-
キーワード「one」の1つのドキュメントに2つの一致
-
キーワード「three」の0個のドキュメントで0個の一致
これで、MySQLシェルを終了できます。
quit
結論
このチュートリアルでは、Sphinxをインストールし、SphinxQLとMySQLを使用して簡単な検索を行う方法を示しました。
また、公式のhttps://github.com/sphinxsearch/sphinx/tree/master/api[PHP、Perl、Python、Ruby、JavaのネイティブSphinxAPI実装]も見つけることができます。 Nodejsを使用している場合は、https://www.npmjs.com/package/sphinxapi [SphinxAPIパッケージ]も使用できます。
Sphinxを使用すると、サイトにカスタム検索を簡単に追加できます。 Sphinxの使用の詳細については、http://sphinxsearch.com [プロジェクトWebサイト]をご覧ください。