elasticsearchのBulk APIでは改行してはならない

諸事情で最近elasticsearchを使っているんですが、しばらくはまったのでメモ。

elasticsearchには、Bulk APIというデータをまとめて追加したり消したりする便利なAPIがあるんですが、これがリクエストにJSONもどきを求めるんですね。

{"index":{"_index":"nekomimi","_type":"group"}}
{"id":"hoge"}

これで{"id":"hoge"}が挿入できます。1行目に命令を、2行目にデータを流すという感じですね。
これを続けて、

{"index":{"_index":"nekomimi","_type":"group"}}
{"id":"hoge"}
{"index":{"_index":"nekomimi","_type":"group"}}
{"id":"hage"}
{"index":{"_index":"nekomimi","_type":"group"}}
{"id":"neko"}

のように3つまとめてデータを入れることもできてこういうところが便利なAPIです。

しかし、これが複雑な場合にハマりました。

{"index":{"_index":"nekomimi","_type":"group"}}
{"id":2,"users":[
  {"user":139340004,"updated_at":"Tue Aug 11 05:55:23 +0000 2015","tweets":[630980415889670100]},
  {"user":84863232,"updated_at":"Tue Aug 11 05:55:12 +0000 2015","tweets":[630980273216172000]},
  {"user":95602570,"updated_at":"Tue Aug 11 05:53:55 +0000 2015","tweets":[630980241591107600]}
]}

このように複雑でひとまず手でデータを作成したわけですよ。
これ死にます。

正しくはこうです。

{"index":{"_index":"nekomimi","_type":"group"}}
{"id":2,"users":[{"user":139340004,"updated_at":"Tue Aug 11 05:55:23 +0000 2015","tweets":[630980415889670100]},{"user":84863232,"updated_at":"Tue Aug 11 05:55:12 +0000 2015","tweets":[630980273216172000]},{"user":95602570,"updated_at":"Tue Aug 11 05:53:55 +0000 2015","tweets":[630980241591107600]}]}

つまりデータはデータで1行じゃないといけないんですね。

そもそもこんなJSONもどきを投げさせるな

追記(2015/08/19 16:36)

この記事を投稿した直後に大谷さんよりなぜこのような形なのかコメントをいただきました。ありがとうございます。