当前位置:   article > 正文

ElasticSearch高级客户端搜索之滚动API_elasticsearch actionlistener

elasticsearch actionlistener

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

(1)通过设置所需的滚动id和滚动间隔来创建SearchScrollRequest
(2)读取新的滚动id,该id指向保持活动状态的搜索上下文,在接下来的搜索滚动调用中需要该上下文
(3)检索另一批搜索命中值

清除滚动上下文

最后,可以使用Clear scroll API删除最后一个滚动标识符,以释放搜索上下文。这在滚动到期时自动发生,但最好是在滚动会话完成后立即执行。(这个会有另外一篇文章)

可选参数

以下参数可以选择提供时,构建SearchScrollRequest:

scrollRequest.scroll(TimeValue.timeValueSeconds(60L));1)
scrollRequest.scroll("60s");2
  • 1
  • 2

(1)滚动间隔作为时间值
(2)滚动间隔作为字符串

同步执行

SearchResponse searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
  • 1

异步执行

异步执行一个搜索滚动请求需要两个SearchScrollRequest实例和一个ActionListener实例被传递到异步方法:

client.scrollAsync(scrollRequest, RequestOptions.DEFAULT, scrollListener);1
  • 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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

(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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

(1)通过发送初始的SearchRequest来初始化搜索上下文
(2)通过循环调用搜索滚动api来检索所有搜索结果,直到没有返回文档为止
(3)处理返回的搜索结果
(4)创建一个新的SearchScrollRequest,其中包含最近返回的滚动标识符和滚动间隔
(5)完成滚动后清除滚动上下文

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/961039
推荐阅读
相关标签
  

闽ICP备14008679号