全文検索エンジン Elasticsearch の公式クライアントの一つ、Elasticsearch-PHP を使ってみました。

Elasticsearch なんてお洒落なソリューションを、お洒落とは言えない PHP で扱うことに抵抗がありますか。筆者には無いですけど、言わんとすることは分かります。でも 公式クライアントが用意されていることに光が見える。
インストール
公式サイトに記載されている通りに composer.json を用意して Composer でインストール。
composer.json file:
{
"require": {
"elasticsearch/elasticsearch": "~2.0"
}
}
Install the client with composer:
# cd path/to/elasticsearch-php # composer install --no-dev
GitHub のリポジトリは以下です。
Elasticsearch クライアントの作成
デフォルトでは localhost:9200 に接続されます。Elasticsearch サーバと App サーバが別サーバの場合は setHosts メソッドで接続先の Elasticsearch サーバを指定します。配列で指定しなければならないので注意。
$client = Elasticsearch\ClientBuilder::create() ->setHosts(['192.168.1.1:9200']) ->build();
尚、Elasticsearch サーバ側ですが、デフォルトでは localhost 以外からは接続できません。設定変更は /etc/elasticsearch/elasticsearch.yml を編集します。
... network.host: __local__, __site__ ...
上記の例では、localhost とローカル アドレス(Elasticsearch ホストのローカルアドレスと同じセグメント)が許可されます。設定値の詳細については公式ドキュメントを参照。
API アクセス
あとは公式サイトのリファレンスを参照して必要な API を叩けば OK です。
基本的には Elasticsearch REST API の PHP ラッパーという理解でよいと思います。配列でパラメータを渡すと配列で結果を返してくれます。公式サイトのリファレンスはすべてのエンドポイントを網羅していません。記載のない API についてはソースコードや本家のリファレンスを参照。
サンプル コード
サンプルとして Indecies API の Analyze メソッドを試してみます。Index と Analyzer は登録済みの前提です。ちなみに Indecies は Index の複数形です。「インディシーズ」と黙読する感じで。
Analyzer には日本語形態素解析用の Kuromoji を設定しています。
$text = 'Elasticsearchなんてお洒落なソリューションを、お洒落とは言えないPHPで扱うことに抵抗がありますか。';
$client = Elasticsearch\ClientBuilder::create()->build();
$result = $client->indices()->analyze([
'index' => 'my_index',
'analyzer' => 'my_kuromoji_analyzer',
'text' => $text
]);
var_dump(implode(' / ', array_column($result['tokens'], 'token')));
// elasticsearch / お洒落 / ソリューション / お洒落 / 言える / php / 扱う / 抵抗
print_r($result);
$result
Array
(
[tokens] => Array
(
[0] => Array
(
[token] => elasticsearch
[start_offset] => 0
[end_offset] => 13
[type] => word
[position] => 0
)
[1] => Array
(
[token] => お洒落
[start_offset] => 16
[end_offset] => 19
[type] => word
[position] => 2
)
[2] => Array
(
[token] => ソリューション
[start_offset] => 20
[end_offset] => 27
[type] => word
[position] => 4
)
[3] => Array
(
[token] => お洒落
[start_offset] => 29
[end_offset] => 32
[type] => word
[position] => 6
)
[4] => Array
(
[token] => 言える
[start_offset] => 34
[end_offset] => 36
[type] => word
[position] => 9
)
[5] => Array
(
[token] => php
[start_offset] => 38
[end_offset] => 41
[type] => word
[position] => 11
)
[6] => Array
(
[token] => 扱う
[start_offset] => 42
[end_offset] => 44
[type] => word
[position] => 13
)
[7] => Array
(
[token] => 抵抗
[start_offset] => 47
[end_offset] => 49
[type] => word
[position] => 16
)
)
)
おまけ
現時点の最新バージョン Elasticsearch 2.3 に対応した Elasticsearch-PHP は未リリースで、例えば 2.2 で追加された Analyze メソッドの explain オプションは使用できませんでした。残念。
$result = $client->indices()->analyze([ 'index' => 'my_index', 'analyzer' => 'my_kuromoji_analyzer', 'explain' => TRUE, 'attributes' => ['partOfSpeech'], 'text' => $text ]);
Elasticsearch\Common\Exceptions\UnexpectedValueException "explain" is not a valid parameter.
それでは また次回。
o7gmfg