Ubuntu14.04にSphinxをインストールして構成する方法
序章
Sphinxは、全文検索を可能にするオープンソースの検索エンジンです。 大きなデータを非常に効率的に検索することで最もよく知られています。 インデックスを作成するデータは、通常、SQLデータベース、プレーンテキストファイル、HTMLファイル、メールボックスなど、さまざまなソースから取得できます。
Sphinxの主な機能は次のとおりです。
- 高いインデックス作成と検索のパフォーマンス
- 高度なインデックス作成およびクエリツール
- 高度な結果セットの後処理
- 最大数十億のドキュメント、テラバイトのデータ、および1秒あたり数千のクエリまでの実証済みのスケーラビリティ
- SQLおよびXMLデータソース、およびSphinxQL、SphinxAPI、またはSphinxSE検索インターフェイスとの簡単な統合
- 分散検索による簡単なスケーリング
このチュートリアルでは、配布パッケージに含まれているサンプルSQLファイルを使用してMySQLサーバーでSphinxをセットアップします。 プロジェクトでSphinxを使用する方法の基本的な考え方がわかります。
前提条件
このガイドを開始する前に、次のものが必要です。
- Ubuntu14.04ドロップレット。
- このチュートリアルに従って設定できるsudo非rootユーザー。
ステップ1-MySQLサーバーをインストールする
注:このセクションを完了する必要があるのは、MySQLサーバーがまだインストールされていない場合のみです。
このセクションでは、MySQLサーバーをインストールします。 MySQLでは、Sphinxの検索機能をテストするために使用できるサンプルデータのデータベースを保存できます。
パッケージリストを更新します。
sudo apt-get update
次に、MySQLサーバーをインストールします。
sudo apt-get install mysql-server
要求されたらrootユーザーのパスワードを入力し、確認のために同じパスワードをもう一度入力します。
ステップ2-Sphinxをインストールする
このセクションでは、Sphinxをインストールします。
Sphinxをインストールするには、次のコマンドを実行します。
sudo apt-get install sphinxsearch
これで、サーバーにSphinxが正常にインストールされました。 Sphinxデーモンを起動する前に、それを構成しましょう。
ステップ3–テストデータベースの作成
このセクションでは、パッケージに付属のサンプルSQLファイルを使用してデータベースをセットアップします。
サンプルのSQLファイルをデータベースにインポートしてみましょう。
MySQLサーバーシェルにログインします。
mysql -u root -p
求められたら、MyQLrootユーザーのパスワードを入力します。 プロンプトがmysql>
に変わります。
test
という名前のデータベースを作成します。
CREATE DATABASE test;
SQLファイルをインポートします。
SOURCE /etc/sphinxsearch/example.sql;
次に、MySQLシェルを終了します。
quit
これで、テストデータベースにデータを入力する必要があります。
ステップ4–Sphinxの構成
このセクションでは、Sphinx構成ファイルを構成します。
sphinx.conf
ファイルを作成します。
sudo nano /etc/sphinxsearch/sphinx.conf
Sphinx構成は、実行に不可欠な3つのメインブロックで構成されています。 それらは、 index 、 searchd 、およびsourceです。 これらの各ブロックについて以下に説明します。この手順の最後に、ファイルに貼り付けるためのsphinx.conf
全体が含まれています。
source ブロックには、MySQLサーバーへのソースのタイプ、ユーザー名、およびパスワードが含まれています。 SQLクエリの最初の列は一意のIDである必要があります。 SQLクエリはすべてのインデックスで実行され、データをSphinxインデックスファイルにダンプします。 以下は、各フィールドとソースブロック自体の説明です。
sql_host
:MySQLホストのホスト名。 この例では、これはlocalhostです。 これは、ドメインまたはIPアドレスにすることができます。sql_user
:MySQLログインのユーザー名。 この例では、これはrootです。sql_pass
:MySQLユーザーのパスワード。 この例では、これは rootMySQLユーザーのパスワードです。sql_db
:データを保存するデータベースの名前。 この例では、これはtestです。sql_query
:これはデータをインデックスにダンプするクエリです。
source src1
{
type = mysql
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
sql_query_info = SELECT * FROM documents WHERE id=$id
}
index コンポーネントには、データを格納するためのソースとパスが含まれています。
source
:ソースブロックの名前。 この例では、これはsrc1です。path
:インデックスを保存するためのこのパス。charset_type
:これはインデックスの文字セットです。 また、これをutf-8に設定します。
index test1
{
source = src1
path = /var/lib/sphinxsearch/data/test1
docinfo = extern
charset_type = sbcs
}
searchd コンポーネントには、Sphinxデーモンを実行するためのポートとその他の変数が含まれています。
listen
:これはsphinxデーモンが実行するポートです。 この例では、これは9312です。query_log
:クエリログを保存するためのこのパス。pid_file
:これはSphinxデーモンのPIDファイルへのパスです。max_matches
:検索語ごとに返す一致の最大数。seamless_rotate
:大量のデータを含むインデックスをプリキャッシュするためにローテーションしているときに、検索されたストールを防止します。preopen_indexes
:起動時にすべてのインデックスを強制的にプリオープンするかどうか。unlink_old
:ローテーションが成功したときに古いインデックスコピーのリンクを解除するかどうか。
searchd
{
listen = 9312 # Port to listen on
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
max_matches = 1000
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
binlog_path = /var/lib/sphinxsearch/data
}
コピーして貼り付ける完全な構成は次のとおりです。 以下で変更する必要がある唯一の変数は、強調表示されているソースブロックのsql_pass
です。
source src1
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = password # change this to your root users 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
sql_query_info = SELECT * FROM documents WHERE id=$id
}
index test1
{
source = src1
path = /var/lib/sphinxsearch/data/test1
docinfo = extern
charset_type = sbcs
}
searchd
{
listen = 9312
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
max_matches = 1000
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
binlog_path = /var/lib/sphinxsearch/data
}
ステップ5-インデックスへのデータの追加
このセクションでは、Sphinxインデックスにデータを追加します。
前に作成した構成を使用して、インデックスにデータを追加します。
sudo indexer --all
次のようなものが得られるはずです。
Sphinx 2.0.4-id64-release (r3135)
Copyright (c) 2001-2012, Andrew Aksyonoff
Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file '/etc/sphinxsearch/sphinx.conf'...
indexing index 'test1'...
WARNING: collect_hits: mem_limit=0 kb too low, increasing to 25600 kb
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.005 sec, 33788 bytes/sec, 700.28 docs/sec
total 3 reads, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
total 9 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
インデックスを最新の状態に保つために、cronジョブを作成しましょう。
crontabを開きます。
crontab -e
使用するテキストエディタを尋ねられる場合があります。 どちらかを選択してください。 このチュートリアルでは、nano
を使用しました。
以下をコピーしてファイルの最後に貼り付け、保存して閉じます。
@hourly /usr/bin/indexer --rotate --config /etc/sphinxsearch/sphinx.conf --all
上記のcronジョブは1時間ごとに実行され、デフォルトの構成ファイルを使用して新しいデータをインデックスに追加します。
ステップ6-Sphinxを起動する
このセクションでは、Sphinxデーモンを起動します。
デフォルトでは、Sphinxデーモンはオフになっています。 Sphinxを有効にするには、最初に/etc/default/sphinxsearch
を開きます。
sudo nano /etc/default/sphinxsearch
START=no
の行を見つけて、yesに設定します。
START=yes
次に、ファイルを保存して閉じます。
最後に、Sphinxデーモンを起動します。
sudo service sphinxsearch start
ステップ7-検索のテスト
このセクションでは、検索をテストします。 次のコマンドを入力します。
search this is my test document number
次のようなものが得られるはずです。
Sphinx 2.0.4-id64-release (r3135)
Copyright (c) 2001-2012, Andrew Aksyonoff
Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file '/etc/sphinxsearch/sphinx.conf'...
index 'test1': query 'this is my test document number ': returned 2 matches of 2 total in 0.002 sec
displaying matches:
1. document=1, weight=7431, group_id=1, date_added=Tue Dec 16 09:49:04 2014
id=1
group_id=1
group_id2=5
date_added=2014-12-16 09:49:04
title=test one
content=this is my test document number one. also checking search within phrases.
2. document=2, weight=7431, group_id=1, date_added=Tue Dec 16 09:49:04 2014
id=2
group_id=1
group_id2=6
date_added=2014-12-16 09:49:04
title=test two
content=this is my test document number two
words:
1. 'this': 4 documents, 4 hits
2. 'is': 4 documents, 4 hits
3. 'my': 2 documents, 2 hits
4. 'test': 3 documents, 5 hits
5. 'document': 2 documents, 2 hits
6. 'number': 3 documents, 3 hits
上記では、検索語のテストインデックスから2つの一致を見つけることができます。 単語ごとに一致するものを見つけることもできます。
結論
このチュートリアルでは、コマンドラインを使用した非常に簡単な検索を示しました。 PHP、Perl、Python、Ruby、Javaの公式ネイティブSphinxAPI実装もここここにあります。
PHPを使用している場合、ここはSphinxをテストするための便利な例です。
Sphinxを使用すると、サイトにカスタム検索を簡単に追加できます。 Sphinxの使用の詳細については、プロジェクトのWebサイトにアクセスしてください。