序章

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

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

  • 高いインデックス作成と検索のパフォーマンス
  • 高度なインデックス作成およびクエリツール
  • 高度な結果セットの後処理
  • 最大数十億のドキュメント、テラバイトのデータ、および1秒あたり数千のクエリまでの実証済みのスケーラビリティ
  • SQLおよびXMLデータソース、およびSphinxQL、SphinxAPI、またはSphinxSE検索インターフェイスとの簡単な統合
  • 分散検索による簡単なスケーリング

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

前提条件

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

ステップ1—Sphinxをインストールする

ネイティブパッケージリポジトリにあるため、UbuntuへのSphinxのインストールは簡単です。 apt-getを使用してインストールします。

  1. sudo apt-get install sphinxsearch

これで、サーバーにSphinxが正常にインストールされました。 Sphinxデーモンを起動する前に、それを構成しましょう。

ステップ2–テストデータベースの作成

次に、パッケージに付属のSQLファイルのサンプルデータを使用してデータベースを設定します。 これにより、Sphinx検索が後で機能していることをテストできます。

サンプルSQLファイルをデータベースにインポートしてみましょう。 まず、MySQLサーバーシェルにログインします。

  1. mysql -u root -p

求められたら、MySQLrootユーザーのパスワードを入力します。 プロンプトがmysql>に変わります。

ダミーデータベースを作成します。 ここでは、 test と呼んでいますが、任意の名前を付けることができます。

  1. CREATE DATABASE test;

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

  1. SOURCE /etc/sphinxsearch/example.sql;

次に、MySQLシェルを終了します。

  1. quit

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

ステップ3–Sphinxの構成

Sphinxの構成は、/etc/sphinxsearchsphinx.confというファイルに含まれている必要があります。 構成は、実行に不可欠な3つの主要なブロックで構成されています: index searchd 、およびsource。 使用できる構成ファイルの例を提供し、後でカスタマイズできるように各セクションについて説明します。

まず、sphinx.confファイルを作成します。

  1. sudo nano /etc/sphinxsearch/sphinx.conf

これらのインデックス検索、およびソースブロックのそれぞれについて以下に説明します。 次に、この手順の最後に、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 コンポーネントには、データを格納するためのソースとパスが含まれています。 の

  • 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:大量のデータを含むインデックスをプリキャッシュするためにローテーションしているときに、検索されたストールを防止します。
  • 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		= 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/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を使用してインデックスが最新の状態に保たれていることを確認します。

まず、前に作成した構成を使用して、インデックスにデータを追加します。

  1. sudo indexer --all

次のようなものが得られるはずです。

Output
Sphinx 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を開きます。

  1. crontab -e

使用するテキストエディタを尋ねられる場合があります。 どちらかを選択してください。 このチュートリアルでは、nanoを使用しました。

次のcronジョブは1時間ごとに実行され、前に作成した構成ファイルを使用してインデックスに新しいデータを追加します。 ファイルの最後にコピーして貼り付け、ファイルを保存して閉じます。

crontab
@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all

Sphinxが完全にセットアップおよび構成されたので、サービスを開始して試すことができます。

ステップ5—Sphinxを起動する

デフォルトでは、Sphinxデーモンはオフになっています。 まず、/etc/default/sphinxsearchSTART=noの行をSTART=yesに変更して有効にします。

  1. sudo sed -i 's/START=no/START=yes/g' /etc/default/sphinxsearch

次に、systemctlを使用してSphinxデーモンを再起動します。

  1. sudo systemctl restart sphinxsearch.service

Sphinxデーモンが正しく実行されているかどうかを確認するには、を実行します。

  1. 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インターフェイスを使用してSphinxQL(ポート9306)に接続します。 プロンプトがmysql>に変わります。

  1. mysql -h0 -P9306

文を検索してみましょう。

  1. 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;コマンドは、文のキーワードごとのヒット数も表示します。

いくつかのキーワードを検索してみましょう。

  1. 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一致

これで、MySQLシェルを離れることができます。

  1. quit

結論

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

PHP、Perl、Python、Ruby、Java用の公式のネイティブSphinxAPI実装もあります。 Nodejsを使用している場合は、SphinxAPIパッケージを使用することもできます。

Sphinxを使用すると、サイトにカスタム検索を簡単に追加できます。 Sphinxの使用の詳細については、プロジェクトのWebサイトにアクセスしてください。