前提・実現したいこと
AWS EC2とAWS Elasticsearchサービスを利用して、PHPよりElasticSearchのマルチ検索(msearch)を利用したい。
発生している問題・エラーメッセージ
EalsticSearchのmsearch APIをPHPから利用しようと
以下のサイトを参考にコードを実装しました。
https://discuss.elastic.co/t/elasticsearch-5-0-php-msearch/66716
queryは上記サイトから変更してあります。
PHP
1$client = ClientBuilder::create() 2 ->setHosts(['elasticsearch_endpoint']) 3 ->build(); 4 5 6 $msret = $client->msearch([ 7 'body' => [ 8 [ 9 'index' => 'myIndex', 10 'type' => 'myType', 11 ], 12 [ 13 'query' => [ 14 'match' => [ 15 'query' => '11111111', 16 'fields' => ['_id'] 17 ] 18 ] 19 ], 20 [ 21 'index' => 'myIndex', 22 'type' => 'myType', 23 ], 24 [ 25 'query' => [ 26 'match' => [ 27 'query' => '99999999', 28 'fields' => ['_id'] 29 ] 30 ] 31 ], 32 ] 33 ]); 34
実行後に以下のエラーログが掃きだされました。
local.ERROR: {"error":{"root_cause":[{"type":"parsing_exception","reason":"[match] query doesn't support multiple fields, found [query] and [fields]","line":1,"col":57}],"type":"parsing_exception","reason":"[match] query doesn't support multiple fields, found [query] and [fields]","line":1,"col":57},"status":400} {"userId":["testuser",5],"exception":"[object] (Elasticsearch\Common\Exceptions\BadRequest400Exception(code: 400): {"error":{"root_cause":[{"type":"parsing_exception","reason":"[match] query doesn't support multiple fields, found [query] and [fields]","line":1,"col":57}],"type":"parsing_exception","reason":"[match] query doesn't support multiple fields, found [query] and [fields]","line":1,"col":57},"status":400} at /var/www/snowplow_local/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php:620)
ElasticSearchの公式サイト(https://www.elastic.co/guide/en/elasticsearch/client/php-api/5.0/index.html)を見ると
multi search(msearch)APIが見当たりません。PHPからは使用できないのでしょうか。
又、「試したこと」に記載したようにcurlから起動できないかも試していますが、正常に動作しませんでした。
PHPからのElasticSearchのマルチ検索(msearch)を利用する方法をご存じの方がいたら回答をお願い致します。
該当のソースコード
PHP、Curl
試したこと
curlコマンドをPHPに実装
上記でエラーとなったため、端末(teraterm)からcurlコマンドをPHPから発行する方法を試してみました。
curl -XGET elasticsearch_endpoint/_msearch --data-binary @samplerequest
samplerequetの内容 {"index":"myIndex"}
{"query":{"multi_match":{"query":"11111111","fields":["_id"]}}}
{"index":"myIndex"}
{"query":{"multi_match":{"query":"99999999","fields":["_id"]}}}
上記curlコマンドの結果、正常に(期待通りに)検索ができたため、PHPからcurlを発行する処理を考えましたが動作しません。
curl実行コードは以下です。
PHP
1 $curl = curl_init(); 2 $url = 'elasticsearch_endpoint/myIndex/myType/_msearch --data-bainary @sapmle'; 3 curl_setopt($curl, CURLOPT_URL, $url); 4 curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); 5 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 6 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 7 8 $response = curl_exec($curl); 9 10 $stscode = curl_getinfo($curl, CURLINFO_HTTP_CODE); 11 12 curl_close($curl);
なお、curl_exec()後のstscodeは404でした。
補足情報(FW/ツールのバージョンなど)
環境
PHPバージョン :PHP 7.1.25
AWS SDK for PHPバージョン :3.98.0
フレームワーク(Laravel)バージョン :Laravel Framework 5.5.45
ElasticSearchバージョン :5.5.2
あなたの回答
tips
プレビュー