ElasticSearch高级客户端搜索之滚动API

ElasticSearch高级客户端搜之滚动API(6.8)

滚动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();3assertEquals(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相同。

滚动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)完成滚动后清除滚动上下文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值