前書き

Sphinxは、全文検索を可能にするオープンソースの検索エンジンです。 大きなデータを非常に効率的に検索することで最もよく知られています。 索引付けされるデータは、通常、SQLデータベース、プレーンテキストファイル、HTMLファイル、メールボックスなど、さまざまなソースから取得されます。

Sphinxの主な機能は次のとおりです。

  • 高いインデックス作成と検索のパフォーマンス

  • 高度なインデックス作成およびクエリツール

  • 高度な結果セットの後処理

  • 1秒あたり最大数十億のドキュメント、テラバイトのデータ、数千のクエリまでの実証済みのスケーラビリティ

  • SQLおよびXMLデータソース、SphinxQL、SphinxAPI、またはSphinxSE検索インターフェイスとの簡単な統合

  • 分散検索による簡単なスケーリング

このチュートリアルでは、配布パッケージに含まれているサンプルSQLファイルを使用して、MySQLサーバーでSphinxをセットアップします。 プロジェクトでSphinxを使用する方法の基本的なアイデアが得られます。

前提条件

このガイドを始める前に、次のものが必要です。

  • 1台のCentOS 7サーバー。

  • https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7 [このチュートリアル]に従って設定できるsudo非ルートユーザー。

  • サーバーにインストールされているMySQL。これは、https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-onのステップ2に従ってセットアップできます。 -centos-7 [このチュートリアル]。

ステップ1-Sphinxのインストール

執筆時点では、最新のSphinxバージョンは_2.2.11_です。 最新バージョンは、http://sphinxsearch.com/downloads/release/ [Sphinx Webサイトで]にあります。

Sphinxをインストールする前に、まずその依存関係をインストールする必要があります。

sudo yum install -y postgresql-libs unixODBC

`+ tmp +`ディレクトリに移動して、目立たない場所にSphinxのファイルをダウンロードします。

cd /tmp

`+ wget +`を使用して最新のSphinxバージョンをダウンロードします。

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

求められたら、MySQL rootユーザーのパスワードを入力します。 プロンプトは「+ MariaDB> +」に変わります。

ダミーデータベースを作成します。 ここでは、「テスト」と呼んでいますが、好きな名前を付けることができます。

CREATE DATABASE ;

サンプルSQLファイルをインポートします。

SOURCE /usr/share/doc/sphinx-2.2.11/example.sql;

その後、MySQLシェルを終了します。

quit

これで、サンプルデータで満たされたデータベースができました。 次に、Sphinxの構成をカスタマイズします。

ステップ3 – Sphinxの構成

Sphinxの設定は、 `+ / etc / sphinx `の ` sphinx.conf +`というファイルにある必要があります。 構成は、* index searchd 、および source *の3つのメインブロックで構成されています。

最小限の構成が既に提供されていますが、後でカスタマイズできるように、各セクションを使用および説明するための新しい構成ファイルの例を提供します。

まず、既存の `+ sphinx.conf +`ファイルを移動します。

sudo mv /etc/sphinx/sphinx.conf /etc/sphinx/sphinx.conf2

+ vi`またはお気に入りのテキストエディタで新しい + sphinx.conf`ファイルを作成します。

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 +:データベースからインデックスにデータをダンプするクエリ。

これはソースブロックです。

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/sphinx/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/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 +`変数です。

完全な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/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時間ごとに実行され、前に作成した構成ファイルを使用して新しいデータをインデックスに追加します。 ファイルの最後にコピーして貼り付け、ファイルを保存して閉じます。

crontab

@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がテスト文の `+ 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個の一致

Sphinxのテストが完了したので、必要に応じて `+ DROP DATABASE test; +`でテストデータベースを削除できます。

完了したら、MySQLシェルを終了します。

quit

結論

このチュートリアルでは、Sphinxをインストールし、SphinxQLとMySQLを使用して簡単な検索を行う方法を示しました。

公式のhttps://github.com/sphinx/sphinx/tree/master/api[PHP、Perl、Python、Ruby、およびJavaのネイティブSphinxAPI実装]も見つけることができます。 Nodejsを使用している場合は、https://www.npmjs.com/package/sphinxapi [SphinxAPIパッケージ]も使用できます。

Sphinxを使用すると、サイトにカスタム検索を簡単に追加できます。 Sphinxの使用に関する詳細については、http://sphinx.com [the project website]をご覧ください。