序章
Sphinxは、全文検索を可能にするオープンソースの検索エンジンです。 大きなデータを非常に効率的に検索することで最もよく知られています。 インデックスを作成するデータは、通常、SQLデータベース、プレーンテキストファイル、HTMLファイル、メールボックスなど、非常に異なるソースから取得できます。
Sphinxの主な機能は次のとおりです。
- 高いインデックス作成と検索のパフォーマンス
- 高度なインデックス作成およびクエリツール
- 高度な結果セットの後処理
- 最大数十億のドキュメント、テラバイトのデータ、および1秒あたり数千のクエリまでの実証済みのスケーラビリティ
- SQLおよびXMLデータソース、およびSphinxQL、SphinxAPI、またはSphinxSE検索インターフェイスとの簡単な統合
- 分散検索による簡単なスケーリング
このチュートリアルでは、配布パッケージに含まれているサンプルSQLファイルを使用してMySQLサーバーでSphinxをセットアップします。 プロジェクトでSphinxを使用する方法の基本的な考え方がわかります。
前提条件
このガイドを開始する前に、次のものが必要です。
-
1台のCentOS7サーバー。
-
このチュートリアルに従って設定できるsudo非rootユーザー。
-
サーバーにインストールされたMySQL。これは、このチュートリアルのステップ2に従ってセットアップできます。
ステップ1—Sphinxをインストールする
執筆時点で、最新のSphinxバージョンは2.2.11です。 最新バージョンは、SphinxのWebサイトで見つけることができます。
Sphinxをインストールする前に、まずその依存関係をインストールする必要があります。
- sudo yum install -y postgresql-libs unixODBC
に移動します tmp
目立たない場所にSphinxのファイルをダウンロードするためのディレクトリ。
- cd /tmp
を使用して最新のSphinxバージョンをダウンロードします wget
.
- wget http://sphinxsearch.com/files/sphinx-2.2.11-1.rhel7.x86_64.rpm
最後に、を使用してインストールします yum
.
- sudo yum install -y sphinx-2.2.11-1.rhel7.x86_64.rpm
これで、サーバーにSphinxが正常にインストールされました。 Sphinxデーモンを起動する前に、それを構成しましょう。
ステップ2–テストデータベースの作成
ここでは、パッケージに付属のSQLファイルのサンプルデータを使用してデータベースを設定します。 これにより、Sphinx検索が後で機能していることをテストできます。
サンプルSQLファイルをデータベースにインポートしてみましょう。 まず、MySQLサーバーシェルにログインします。
- mysql -u root -p
求められたら、MySQLrootユーザーのパスワードを入力します。 プロンプトがに変わります MariaDB>
.
ダミーデータベースを作成します。 ここでは、 test と呼んでいますが、任意の名前を付けることができます。
- CREATE DATABASE test;
サンプルSQLファイルをインポートします。
- SOURCE /usr/share/doc/sphinx-2.2.11/example.sql;
次に、MySQLシェルを終了します。
- quit
これで、サンプルデータで満たされたデータベースができました。 次に、Sphinxの構成をカスタマイズします。
ステップ3–Sphinxの構成
Sphinxの構成は、というファイルに含まれている必要があります sphinx.conf
の /etc/sphinx
. 構成は、 index 、 searchd 、およびsourceの3つのメインブロックで構成されています。
すでに提供されている最小限の構成がありますが、後でカスタマイズできるように、使用して各セクションを説明するための新しい構成ファイルの例を提供します。
まず、既存のものを移動します sphinx.conf
ファイル。
- sudo mv /etc/sphinx/sphinx.conf /etc/sphinx/sphinx.conf2
新しいを作成します sphinx.conf
とファイル vi
またはお気に入りのテキストエディタ。
- sudo vi /etc/sphinx/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
:データベースからインデックスにデータをダンプするクエリ。
これはソースブロックです:
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 コンポーネントには、データを格納するためのソースとパスが含まれています。 の
source
:ソースブロックの名前。 この例では、これはsrc1です。path
:インデックスを保存するためのパス。
index test1
{
source = src1
path = /var/lib/sphinx/test1
docinfo = extern
}
searchd コンポーネントには、Sphinxデーモンを実行するためのポートおよびその他の変数が含まれています。
listen
:Sphinxデーモンが実行されるポートと、それに続くプロトコル。 この例では、これは 9306:mysql41です。 既知のプロトコルは、:sphinx (SphinxAPI)および:mysql41 (SphinxQL)です。query_log
:クエリログを保存するためのパス。pid_file
:SphinxデーモンのPIDファイルへのパス。seamless_rotate
:大量のデータを含むインデックスをプリキャッシュするためにローテーションしているときに、検索されたストールを防ぎます。preopen_indexes
:起動時にすべてのインデックスを強制的にプリオープンするかどうか。unlink_old
:ローテーションが成功したときに古いインデックスコピーを削除するかどうか。
searchd
{
listen = 9312:sphinx #SphinxAPI port
listen = 9306:mysql41 #SphinxQL port
log = /var/log/sphinx/searchd.log
query_log = /var/log/sphinx/query.log
read_timeout = 5
max_children = 30
pid_file = /var/run/sphinx/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
binlog_path = /var/lib/sphinx/
}
コピーして貼り付ける完全な構成は次のとおりです。 以下で変更する必要がある唯一の変数は sql_pass
強調表示されているソースブロックの変数。
source src1
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = your_root_mysql_password
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/sphinx/test1
docinfo = extern
}
searchd
{
listen = 9306:mysql41
log = /var/log/sphinx/searchd.log
query_log = /var/log/sphinx/query.log
read_timeout = 5
max_children = 30
pid_file = /var/run/sphinx/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
binlog_path = /var/lib/sphinx/
}
その他の構成を調べるには、 /usr/share/doc/sphinx-2.2.11/sphinx.conf.dist
すべての変数が詳細に説明されているファイル。
ステップ4—インデックスの管理
このステップでは、Sphinxインデックスにデータを追加し、を使用してインデックスが最新の状態に保たれていることを確認します。 cron
.
まず、前に作成した構成を使用して、インデックスにデータを追加します。
- sudo indexer --all
次のようなものが得られるはずです。
OutputSphinx 2.2.11-id64-release (95ae9a6)
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file '/etc/sphinx/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.006 sec, 29765 bytes/sec, 616.90 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
次のCronジョブは1時間ごとに実行され、前に作成した構成ファイルを使用して新しいデータをインデックスに追加します。 ファイルの最後にコピーして貼り付け、ファイルを保存して閉じます。
@hourly /usr/bin/indexer --rotate --config /etc/sphinx/sphinx.conf --all
Sphinxが完全にセットアップおよび構成されたので、サービスを開始して試すことができます。
ステップ5—Sphinxを起動する
使用する systemctl
Sphinxデーモンを起動します。
- sudo systemctl start searchd
Sphinxデーモンが正しく実行されているかどうかを確認するには、次のコマンドを実行します。
- sudo systemctl status searchd
次のようなものが得られるはずです。
Output● searchd.service - SphinxSearch Search Engine
Loaded: loaded (/usr/lib/systemd/system/searchd.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2016-08-19 17:48:39 UTC; 5s ago
. . .
Sphinxは完全にカスタマイズされて実行されているため、次に正しく機能することを確認します。
ステップ6—検索機能のテスト
すべての設定が完了したので、検索機能をテストしてみましょう。 MySQLインターフェースを使用して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が私たちから2つの一致を見つけたことがわかります test1
テスト文のインデックス。 The 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つの一致
- キーワード「3」の0ドキュメントで0一致
Sphinxをテストしたので、次のコマンドでテストデータベースを削除できます。 DROP DATABASE test;
もし良かったら。
完了したら、MySQLシェルを終了します。
- quit
結論
このチュートリアルでは、Sphinxをインストールし、SphinxQLとMySQLを使用して簡単な検索を行う方法を示しました。
PHP、Perl、Python、Ruby、Java用の公式のネイティブSphinxAPI実装もあります。 Nodejsを使用している場合は、SphinxAPIパッケージを使用することもできます。
Sphinxを使用すると、サイトにカスタム検索を簡単に追加できます。 Sphinxの使用の詳細については、プロジェクトのWebサイトにアクセスしてください。