その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Elasticsearchに実際に書き込むテストなんかで「indexへの反映に時間がかかって困る〜〜」って時

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を叩く

www.elastic.co

fixtureを投入してから明示的にindex refresh APIを叩くという方法.叩くとデータが即座に近くindexに反映されるようになるので用途としてはマッチすると思います.これであればproductionのindex templateをそのまま流用できるので便利ですが,まいどまいどrefresh APIを叩くコードを挟まなければならないので,そこは何らかのtest utilityみたいなものでカバーするなどといった工夫が必要そうです.


Plan C. ?refreshをクエリに付ける

www.elastic.co

更新系のクエリを発行する際に?refreshというクエリパラメータをつけると,こちらも即座に近くindexにデータが反映されるようです.お手軽!




他にもあるかもですが,用途と場合に応じたものを使うと良いと思います.

テストが速くなってよかった!