アゴ乗せ日記

適当なポジティブ日記

スポンサーリンク

【Guzzle】Elasticsearch Bulk APIでハマってた話【Laravel】

How do to Elasticsearch bulk api in guzzle on laravel.

なんかエラーがでて投入も削除もできません

久しぶりやな

どんなエラーがでたのか

The bulk request must be terminated by a newline

エラーメッセージ自体は大したことなくて

「Bulkリクエストするならデータの最後は改行しろよ」

ってこと。

...

改行すりゃええやん!!

でもエラーがでるんだってさ

NGな例

        $client = new \GuzzleHttp\Client();
        $del_data = '{"delete":{"_id":"tekito-"}}\n';
        $result = $client->request(
                'POST',
                'http://localhost:9200/test/items/_bulk?pretty',
                [
                    'http_errors' => false,
                    'timeout' => 60,
                    'headers'  => ['content-type' => 'application/json', 'Accept' => 'application/json'],
                    'body' => $del_data
                ]
        );

        $json  = $result->getBody()->getContents();
        Log::debug($json);

まぁやりたいことはわかる。

$del_data = '{"delete":{"_id":"tekito-"}}\n';

の最後に\nで改行コードいれてるのね。

でもこれだと

The bulk request must be terminated by a newline

400 bad requestになる。

ようわからんけど

OKな例

        $client = new \GuzzleHttp\Client();
        $del_data = '{"delete":{"_id":"tekito-"}}';
        $result = $client->request(
                'POST',
                'http://localhost:9200/test/items/_bulk?pretty',
                [
                    'http_errors' => false,
                    'timeout' => 60,
                    'headers'  => ['content-type' => 'application/json', 'Accept' => 'application/json'],
                    'body' => $del_data . "\n"
                ]
        );

        $json  = $result->getBody()->getContents();
        Log::debug($json);

だとうまく行く。

何が変わったか?

$del_data = '{"delete":{"_id":"tekito-"}}';

さっきの$del_dataの末尾の\nを除外し,

'body' => $del_data . "\n"

bodyの部分で . "\n" を追記してあげてる。

え?これで動くん?

これで普通に動く。

あとハマりそうな部分

'body' => $del_data . "\n"

'json' => $del_data . "\n"

のようにbodyjsonにしても

The bulk request must be terminated by a newline

になる。

おわり

ようわからんけど、そうみたい。

スポンサーリンク