Elasticsearch-PHP を使ってみた

April 14, 2016

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

Note for 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 APIAnalyze メソッドを試してみます。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.

それでは また次回。

One thought on “Elasticsearch-PHP を使ってみた

コメントを残す

メールアドレスが公開されることはありません。