前書き

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サイト]をご覧ください。