このAPIでスキャン&スクロールはできますか?
はい、そうです。私の実装はこのように機能しています。
エラスティック検索でスクロール検索を開始します。
public SearchResult startScrollSearch (String type, Long size) throws IOException {
String query = ConfigurationFactory.loadElasticScript("my_es_search_script.json");
Search search = new Search.Builder(query)
// multiple index or types can be added.
.addIndex("myIndex")
.addType(type)
.setParameter(Parameters.SIZE, size)
.setParameter(Parameters.SCROLL, "1m")
.build();
SearchResult searchResult = EsClientConn.getJestClient().execute(search);
return searchResult;
}
SearchResult オブジェクトは、通常どおり検索から最初の (サイズの) itens を返しますが、elasticSearch がメモリに保持する resultSet を維持するための参照である scrollId パラメータに戻ります。Parameters.SCROLL は、この検索がメモリに保持される時間を定義します。
scrollId を読み取るには:
scrollId = searchResult.getJsonObject().get("_scroll_id").getAsString();
resultSet からさらに項目を読み取るには、次のようなものを使用する必要があります。
public JestResult readMoreFromSearch(String scrollId, Long size) throws IOException {
SearchScroll scroll = new SearchScroll.Builder(scrollId, "1m")
.setParameter(Parameters.SIZE, size).build();
JestResult searchResult = EsClientConn.getJestClient().execute(scroll);
return searchResult;
}
結果セットから読み取るたびに、エラスティックから新しい scrollId が返されることを忘れないでください。
ご不明な点がございましたら、おっしゃってください。