elasticsearch-php で全件取得


elasticsearch-php で特定のindexから全件取得する方法です。

方法1

index だけを指定すると全件取得になるようです。
sort 設定をしたいので body に入れています。

use Elasticsearch\ClientBuilder;

class ElasticSearch
{
    public function getAll()
    {
        $client = ClientBuilder::create()
            ->setHosts([ENV('ELASTICSEARCH_HOST', 'elasticsearch') . ':' . ENV('ELASTICSEARCH_PORT', '9200')])
            ->build();

        $searchResults = $client->search([
            'index' => 'index_name',
            'body' => [
                'sort' => [
                    'created_at' => ['order' => 'desc'],
                ],
            ],
        ]);
    }
}

方法2

最初こちらの方法2しか知らなかったので方法1を使わなかったのですが、特に理由がなければ方法1で良さそうでした。
動作に微妙な違いがあるかもしれませんが、詳細は未検証です。

match_all を使うと全件取得になります。


use Elasticsearch\ClientBuilder;

class ElasticSearch
{
    public function getAll()
    {
        $client = ClientBuilder::create()
            ->setHosts([ENV('ELASTICSEARCH_HOST', 'elasticsearch') . ':' . ENV('ELASTICSEARCH_PORT', '9200')])
            ->build();

        $searchResults = $client->search([
            'index' => 'index_name',
            'from' => 0,
            // 設定可能上限値なので実質無制限扱い
            'size' => 10000,
            'body' => [
                'query' => [
                    // see: see: https://github.com/elastic/elasticsearch-php/issues/495
                    'match_all' => (object)[]
                ],
            ],
        ]);
    }
}