Laravel5.8 Scout Elasticsearch match_all検索しようとすると400エラー
- Laravel 5.8
- Laravel Scout 7.1
- Elasticsearch 5.6
こちちを参考にLaravel+Scout+ElasticSearch環境を作成。
全取得がしたいので下記のように match_all
でクエリを投げようとした。
<?php // web.php use \Elasticsearch\Client as Elastic; if (config('app.env') !== 'production') { Route::get('/es-test', function () { return App\Models\User::search(\request('q'), function (Elastic $elastic, string $query, array $params) { $params['body']['query'] = [ 'match_all' => [], ]; return $elastic->search($params); })->paginate(); }); }
結果下記エラー。
Elasticsearch \ Common \ Exceptions \ BadRequest400Exception (400) {"error":{"root_cause":[{"type":"parsing_exception","reason":"[match_all] query malformed, no start_object after query name","line":1,"col":23}],"type":"parsing_exception","reason":"[match_all] query malformed, no start_object after query name","line":1,"col":23},"status":400}
ググると下記のissueがヒット。
Issue with "match_all" search query · Issue #495 · elastic/elasticsearch-php · GitHub
<?php if (config('app.env') !== 'production') { Route::get('/es-test', function () { return App\Models\User::search(\request('q'), function (Elastic $elastic, string $query, array $params) { $params['body']['query'] = [ 'match_all' => (object)[], ]; return $elastic->search($params); })->paginate(); }); }
このように object
のキャストが必要だったようだ。
おそらく、
{"query": { "match_all": [] } }
ではなく
{"query": { "match_all": {} } }
というJSONを投げるためにキャストする必要があったのだろう。