Elastic4s の SearchIterator で ElasticSearch から大量のデータを取得する
こんにちは、 @kz_morita です。
Scala で ElasticSearch から大量の件数のデータを取得する必要があり実装をしました。 ライブラリは Elastic4s を使用しています。
https://github.com/sksamuel/elastic4s 要求として、1万件以上の数の多いデータを ElasticSearch から取得する必要があったのですが、デフォルトでは 1万件ずつしか取得できません。 軽く調べたところアプリケーション側で繰り返し取得するか、ElasticSearch の Scroll API を使用する必要がありそうでした。
Elastic4s に ScrollAPI への繰り返しリクエストを Wrap してくれる SearchIterator があったのでそれを利用してみました。
SearchIterator を使った取得 以下のような SearchIterator を使用したコードで1万件以上のデータを取得することができました。
import com.sksamuel.elastic4s._ import com.sksamuel.elastic4s.ElasticDsl._ import com.sksamuel.elastic4s.circe._ import com.sksamuel.elastic4s.http.JavaClient import scala.util.{Failure, Success, Using} // ... // .. // . // ElasticSearch の Client を生成 private def buildClient: ElasticClient = ElasticClient(JavaClient(ElasticProperties(s"https://$host"))) // ElasticSearch から取得した結果から読み込むための case class case class FetchItemIdResult(itemId: String) object FetchItemIdResult { implicit val hitReader: HitReader[FetchItemIdResult] = hitReaderWithCirce[FetchItemIdResult] } // itemCategory から itemId を種痘する override def fetchItemIds(itemCategory: ItemCategory): IO[Error, Seq[ItemId]] = { ZIO.