Laravel5.8 Scout Elasticsearch match_all検索しようとすると400エラー

  • Laravel 5.8
  • Laravel Scout 7.1
  • Elasticsearch 5.6

tech.fusic.co.jp

こちちを参考に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を投げるためにキャストする必要があったのだろう。