Elasticsearchに実際に書き込むテストなんかで「indexへの反映に時間がかかって困る〜〜」って時
Elasticsearchに実際に書き込む系のテスト,どうやってもindexの反映のために1000ms待つことになるためテストケースを書けば書くほど線形にテスト時間が増えてゆき頭を抱えている
— 好評分譲中 (@moznion) 2018年10月11日
Elasticsearchに実際に書き込む系のテストをするとき,例えば「fixtureを作ってindexしてクエリ打ってちゃんと結果が取れるかどうか」みたいなことをやると思うんですが,fixtureをindexする際にそのデータがindexに反映されるまでにrefresh_interval
ぶんの時間がかかってつらい!!! というときにどうするかという話です.
Plan A. refresh_interval
をめっちゃ短くする
要はrefresh_interval
がめっちゃ短ければ解決する(こともある)話なのでそれをやるという方法.上記のtweetで「1000ms」とか言ってるのはあくまでデフォルト値なので,それをカスタムしてやると良いという話です.
{ "settings": { ... "refresh_interval": "1ms" } }
などとしてやればindexへのdataの反映周期が1msecになるのでまあ充分でしょう,という割り切った感じです.テスト用途であればほぼ多くの場合はこれでも動作すると思います.コード自体に手を入れる必要がないのは良さそう.
が,間違えてもproduction環境に入れてはならない設定なのでindex templateを別個に管理する必要が出てくるでしょう.
Plan B. index refresh APIを叩く
fixtureを投入してから明示的にindex refresh APIを叩くという方法.叩くとデータが即座に近くindexに反映されるようになるので用途としてはマッチすると思います.これであればproductionのindex templateをそのまま流用できるので便利ですが,まいどまいどrefresh APIを叩くコードを挟まなければならないので,そこは何らかのtest utilityみたいなものでカバーするなどといった工夫が必要そうです.
なんか indices refresh 的なの手で叩いたらなんとかなりませんか。ぼくが触ってたの太古だから今は事情が違うかもしれない
— じゅりあす (@ast_j) 2018年10月11日
Plan C. ?refresh
をクエリに付ける
更新系のクエリを発行する際に?refresh
というクエリパラメータをつけると,こちらも即座に近くindexにデータが反映されるようです.お手軽!
更新クエリーに ?refresh つけたら即座に反映されそうな気がする https://t.co/vk80VcsgS6
— さいくろん (@xaicron) 2018年10月11日
他にもあるかもですが,用途と場合に応じたものを使うと良いと思います.
@ast_j @xaicron indexリクエスト投げたあとにindex flush APIぶっ叩いたら良い感じになりました! ありがとうございます! https://t.co/v9OUHZN2rw
— 好評分譲中 (@moznion) 2018年10月11日
はちゃめちゃにテスト速くなってえびす顔
— 好評分譲中 (@moznion) 2018年10月11日
テストが速くなってよかった!