是否可以使用此 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,但将返回一个 scrollId 参数,该参数是对弹性搜索为您保存在内存中的剩余 resultSet 的引用。Parameters.SCROLL,将定义此搜索将保留在内存中的时间。
阅读scrollId:
scrollId = searchResult.getJsonObject().get("_scroll_id").getAsString();
要从结果集中读取更多项目,您应该使用以下内容:
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;
}
不要忘记,每次从结果集中读取时,都会从 elastic 返回一个新的 scrollId。
如果您有任何疑问,请告诉我。