#概要
ElasticSearchとkuromojiプラグインの導入方法はこちらをご参照ください。
要は、curlコマンドのコレをphpでやりたい。
$ curl -XGET "localhost:9200/_analyze?analyzer=kuromoji&pretty" -d "お寿司食べたい"
{
"tokens" : [ {
"token" : "寿司",
"start_offset" : 1,
"end_offset" : 3,
"type" : "word",
"position" : 2
}, {
"token" : "食べる",
"start_offset" : 3,
"end_offset" : 5,
"type" : "word",
"position" : 3
} ]
}
#サンプルコード
だいぶ適当ですが。
ご参考までに。
analyze_word_by_elasticsearch.php
<?php
/**
* ElasticSearchとのやり取りをするクラス
*/
class ElasticSearchService
{
/** 接続先のElasticSearchのURL & ポート */
const BASE_URL = 'localhost';
const PORT = '9200';
/**
* リクエスト用のオプションを設定
*/
protected function create_options($url, $body)
{
return array(
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $body,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true,
);
}
/**
* リクエストURLを生成
*/
protected function create_request_url()
{
return self::BASE_URL.':'.self::PORT.'/_analyze?'.http_build_query(array(
'analyzer' => 'kuromoji', // 形態素解析にkuromojiプラグインを利用する
'pretty' => true,
));
}
/**
* リクエストを実行
*/
protected function request($options)
{
$ch = curl_init();
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($result, 0, $header_size);
$result = substr($result, $header_size);
curl_close($ch);
return array(
'Header' => $header,
'Result' => $result,
);
}
/**
* 指定した文字列を形態素解析し、結果を返却する
*/
public function analyze_word($text)
{
return $this->request($this->create_options($this->create_request_url(), $text));
}
}
// 引数チェック
if ($argc < 2) {
exit('引数に解析対象の文字列を指定してください');
}
$text = $argv[1];
$service = new ElasticSearchService();
// 実行 & 結果出力
print_r($service->analyze_word($text));
#実行
$ php analyze_word_by_elasticsearch.php お寿司食べたい
Array
(
[Header] => HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 257
[Result] => {
"tokens" : [ {
"token" : "寿司",
"start_offset" : 1,
"end_offset" : 3,
"type" : "word",
"position" : 2
}, {
"token" : "食べる",
"start_offset" : 3,
"end_offset" : 5,
"type" : "word",
"position" : 3
} ]
}
)
一応、gistにもあげときました。