IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Elasticsearch-Scroll -> 正文阅读

[大数据]Elasticsearch-Scroll

目录

Request

先决条件

描述

路径参数

查询参数

Request body

Search Scroll Api

Initialize the search scroll context

检索所有相关文档

Clear the scroll context

可选参数

同步执行

异步执行

Response

完整的例子


背景:因为在开发过程中有个拉取数据的需求,数据都存在es中,刚开始用了分页查询,但是超过10000数据量之后报错。所以需要学习滚轮查询来解决该问题。

ES官方不再建议使用ScrollAPI进行深度分页。如果在分页超过10000次点击时需要保留索引状态,请使用带有时间点(PIT)的search_after参数。

检索滚动搜索的下一批结果。

GET /_search/scroll
{
  "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}

Request

GET /_search/scroll/<scroll_id>?Deprecated in 7.0.0.

GET /_search/scroll

POST /_search/scroll/<scroll_id>Deprecated in 7.0.0.

POST /_search/scroll

先决条件

如果启用了Elasticsearch安全功能,则必须对目标数据流、索引或别名具有读取索引权限。

描述

我们可以使用scroll api从单个滚动搜索请求中检索大量结果。

scroll API需要滚动ID。若要获取滚动ID,请提交包含滚动查询参数参数的搜索API请求。scroll参数指示Elasticsearch应该为请求保留搜索上下文多长时间。

搜索响应在_scroll_id?response body参数中返回一个scroll ID。然后,我们可以使用scroll ID和scroll API来检索请求的下一批结果。如果启用了Elasticsearch安全功能,则对特定滚动ID的结果的访问将仅限于提交搜索的用户或API密钥。

还可以使用scroll API指定新的scroll参数,以延长或缩短搜索上下文的保留期。

请参阅滚动搜索结果。

滚动搜索的结果反映了初始搜索请求时索引的状态。随后的索引或文档更改只会影响以后的搜索和滚动请求。

路径参数

<scroll_id>

在7.0.0中已弃用。(可选,字符串)搜索的滚动ID。

滚动ID可以很长。我们建议只使用scroll_id request body参数指定scroll id。

查询参数

scroll

(可选,时间值)保留滚动搜索上下文的时间段。

此值覆盖由原始搜索API请求的scroll参数设置的持续时间。

默认情况下,此值不能超过1d(24小时)。我们可以使用search.max_keep_alive集群级别设置更改此限制。

也可以使用scroll request body参数指定此值。如果同时指定了这两个参数,则只使用查询参数。

scroll_id

在7.0.0中已弃用。(可选,字符串)用于搜索的滚动ID。

rest_total_hits_as_int

(可选,布尔值)如果为true,则API响应的hit.total属性将作为整数返回。如果为false,则API响应的hit.total属性将作为对象返回。默认为false。

Request body

scroll

(可选,时间值)保留滚动搜索上下文的时间段。

此值覆盖由原始搜索API请求的scroll参数设置的持续时间。

默认情况下,此值不能超过1d(24小时)。我们可以使用search.max_keep_alive集群级别设置更改此限制。

scroll_id

(必需,字符串)用于搜索的滚动ID。

Response body

scroll API返回与search API相同的响应主体。请参阅搜索API的响应体参数

Search Scroll Api

Scroll API可用于从搜索请求中检索大量结果。

为了使用滚动,需要按照给定的顺序执行以下步骤。

Initialize the search scroll context

必须执行带有滚动参数的初始搜索请求,才能通过搜索API初始化滚动会话。在处理这个SearchRequest时,Elasticsearch会检测到scroll参数的存在,并在相应的时间间隔内保持搜索上下文的活动状态。

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):读取返回的scroll id,它指向保持活动状态的搜索上下文,在下面的搜索scroll调用中需要该上下文

(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().value);
assertEquals(1, hits.getHits().length);
assertNotNull(scrollId);

(1):通过设置所需的滚动id和滚动间隔来创建SearchScrollRequest

(2):读取新的scroll id,它指向保持活动状态的搜索上下文,并且在下面的搜索scroll调用中需要该上下文

(3):检索另一批搜索命中

Clear the scroll context

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

可选参数

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

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

(1):滚动间隔作为时间值

(2):以字符串形式滚动间隔

如果没有为SearchScrollRequest设置滚动值,则搜索上下文将在初始滚动时间(即初始搜索请求中设置的滚动时间)过期后过期。

同步执行

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

异步执行

异步执行搜索滚动请求需要将SearchScrollRequest实例和ActionListener实例传递给异步方法:

client.scrollAsync(scrollRequest, RequestOptions.DEFAULT, scrollListener); 

要执行的SearchScrollRequest和执行完成时要使用的ActionListener

异步方法不会阻塞并立即返回。一旦完成,如果执行成功完成,则使用onResponse方法回调ActionListener;如果执行失败,则使用onFailure方法回调ActionListener。

SearchResponse的典型侦听器如下所示:

ActionListener<SearchResponse> scrollListener =
        new ActionListener<SearchResponse>() {
    @Override
    public void onResponse(SearchResponse searchResponse) {
        (1)
    }

    @Override
    public void onFailure(Exception e) {
        (2)
    }
};

(1):在执行成功完成时调用。响应作为参数提供

(2):失败时调用。引发的异常作为参数提供

Response

search scroll API返回一个SearchResponse对象,与search 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();
    searchHits = searchResponse.getHits().getHits();
}

ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); (5)
clearScrollRequest.addScrollId(scrollId);
ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
boolean succeeded = clearScrollResponse.isSucceeded();

(1):通过发送初始SearchRequest初始化搜索上下文

(2):通过在循环中调用search Scroll api检索所有搜索命中,直到没有返回任何文档

(3):处理返回的搜索结果

(4):创建一个新的SearchScrollRequest,保存最后返回的滚动标识符和滚动间隔

(5):滚动完成后清除滚动上下文

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-13 17:31:50  更:2021-07-13 17:32:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 5:12:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码