赞
踩
滚动API可用于从搜索请求中检索大量结果。
为了使用滚动,需要按照给定的顺序执行以下步骤。
必须执行带有滚动参数的初始搜索请求,以通过搜索API初始化滚动会话。当处理这个搜索请求时,Elasticsearch检测滚动参数的存在,并在相应的时间间隔内保持搜索上下文为活动的。
SearchRequest searchRequest = new SearchRequest("posts");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(matchQuery("title", "Elasticsearch"));
searchSourceBuilder.size(size); (1)
searchRequest.source(searchSourceBuilder);
searchRequest.scroll(TimeValue.timeValueMinutes(1L)); (2)
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
String scrollId = searchResponse.getScrollId(); (3)
SearchHits hits = searchResponse.getHits(); (4)
(1)创建SearchRequest及其对应的SearchSourceBuilder。还可以选择设置大小,以控制一次检索多少结果
(2)设置滚动间隔
(3)读取返回的滚动id,该id指向保持活动状态的搜索上下文,在接下来的搜索滚动调用中需要该上下文
(4)检索第一批搜索结果
作为第二步,接收到的滚动标识符必须设置为SearchScrollRequest以及一个新的滚动间隔,并通过searchScroll方法发送。Elasticsearch返回另一批带有新滚动标识符的结果。然后可以在后续的SearchScrollRequest中使用这个新的滚动标识符来检索下一批结果,等等。这个过程应该在一个循环中重复,直到没有任何结果返回,这意味着滚动已经耗尽,并且检索了所有匹配的文档。
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId); (1)
scrollRequest.scroll(TimeValue.timeValueSeconds(30));
SearchResponse searchScrollResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
scrollId = searchScrollResponse.getScrollId(); (2)
hits = searchScrollResponse.getHits(); (3)
assertEquals(3, hits.getTotalHits());
assertEquals(1, hits.getHits().length);
assertNotNull(scrollId);
(1)通过设置所需的滚动id和滚动间隔来创建SearchScrollRequest
(2)读取新的滚动id,该id指向保持活动状态的搜索上下文,在接下来的搜索滚动调用中需要该上下文
(3)检索另一批搜索命中值
最后,可以使用Clear scroll API删除最后一个滚动标识符,以释放搜索上下文。这在滚动到期时自动发生,但最好是在滚动会话完成后立即执行。(这个会有另外一篇文章)
以下参数可以选择提供时,构建SearchScrollRequest:
scrollRequest.scroll(TimeValue.timeValueSeconds(60L)); (1)
scrollRequest.scroll("60s"); (2)
(1)滚动间隔作为时间值
(2)滚动间隔作为字符串
SearchResponse searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
异步执行一个搜索滚动请求需要两个SearchScrollRequest实例和一个ActionListener实例被传递到异步方法:
client.scrollAsync(scrollRequest, RequestOptions.DEFAULT, scrollListener); (1)
(1)SearchScrollRequest要执行,ActionListener要在执行完成时使用
异步方法不会阻塞并立即返回。一旦ActionListener完成,如果执行成功,则使用onResponse方法回调;如果执行失败,则使用onFailure方法回调。
一个典型的侦听器的SearchResponse看起来像:
ActionListener<SearchResponse> scrollListener =
new ActionListener<SearchResponse>() {
@Override
public void onResponse(SearchResponse searchResponse) {
}(1)
@Override
public void onFailure(Exception e) {
}(2)
};
(1)当执行成功完成时调用。响应作为参数提供
(2)失败时调用。引发的异常作为参数提供
搜索滚动API返回一个SearchResponse对象,与搜索API相同。
下面是滚动搜索的完整示例。
final Scroll scroll = new Scroll(TimeValue.timeValueMinutes(1L)); SearchRequest searchRequest = new SearchRequest("posts"); searchRequest.scroll(scroll); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(matchQuery("title", "Elasticsearch")); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); (1) String scrollId = searchResponse.getScrollId(); SearchHit[] searchHits = searchResponse.getHits().getHits(); while (searchHits != null && searchHits.length > 0) { (2) (3) SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId); (4) scrollRequest.scroll(scroll); searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT); scrollId = searchResponse.getScrollId();(5) searchHits = searchResponse.getHits().getHits(); } ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); clearScrollRequest.addScrollId(scrollId); ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT); boolean succeeded = clearScrollResponse.isSucceeded();
(1)通过发送初始的SearchRequest来初始化搜索上下文
(2)通过循环调用搜索滚动api来检索所有搜索结果,直到没有返回文档为止
(3)处理返回的搜索结果
(4)创建一个新的SearchScrollRequest,其中包含最近返回的滚动标识符和滚动间隔
(5)完成滚动后清除滚动上下文
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。