es游标获取全量数据游标php,ElasticSearch操作之游标查询Scroll Search

一. 什么是游标查询(Scroll)

顾名思义,相当于用一把游标标记查询的位置.

二. 为什么要使用游标查询

在默认情况下,ES查询每次返回的数量最多只有1W条,且只能是前1W条.

这意味着,在不修改配置的情况下,想通过分页的方式(如下)拿到1W条之后的数据是做不到的

GET /索引/类型/_search

{

"size": 10000,

"from": 5000,

"query": {

...

},

"aggs": {

...

}

}

所以自然就有了游标查询.

三. 如何使用游标查询

DSL的用法:

GET 索引/类型/_search?scroll=1m

{

"size": 10000,

"query": {

"match_all": {}

}

}

1m表示:过期时间1分钟

查询结果的第一行会有:

"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBAAAAAAABO-dFmRFSU9NM1VNU2JxNG9UUlNnSmpXMVEAAAAAAL7J_hYxT0dJOVJVMVFxU2I0N2xCR2IyVzJnAAAAAAC- SmQWWk1aN0sxUmRSQmFNS3EwVFh0R0luUQAAAAAAvkplFlpNWjdLMVJkUkJhTUtxMFRYdEdJblE=",

这个_scroll_id就相当于书签,之后的查询带着这个书签,就能根据size不断拿到之后的数据,但是前提是在过期时间之内

之后的查询DSL:

GET _search/scroll

{

"scroll":"1m",

"scroll_id":"DnF1ZXJ5VGhlbkZldGNoBAAAAAAABPP1FmRFSU9NM1VNU2JxNG9UUlNnSmpXMVEAAAAAAL7OTxYxT0dJOVJVMVFxU2I0N2xCR2IyVzJnAAAAAAC-j70WVVlOZkxQRzJRLXlMRlVMbEQtalBfUQAAAAAAyWm-Fk9HdGx1b3VsUXRLZHV4c1E1OExja0E="

}

将获取的scroll_id作为条件继续查询即可,这里不需要再指定索引和类型,因为scroll_id的唯一性.

在过期时间内,之后的查询的scroll_id是不变的.

四. 基于java代码:

RestClient lowClient = RestClient.builder(new HttpHost("主机",端口))

.setMaxRetryTimeoutMillis(300000).build();

RestHighLevelClient client= newRestHighLevelClient(lowClient);

SearchRequest request= new SearchRequest("索引").types("类型");

//这里一次查1W条

SearchSourceBuilder sourceBuilder= new SearchSourceBuilder().size(10000);

request.source(builder).searchType(SearchType.DEFAULT);

//这句代码就是设置游标查询和过期时间

request.scroll(TimeValue.timeValueMinutes(5));

SearchResponse response=client.search(request);//search

SearchResponse response=client.search(request);

//定义游标

String scrollId= null;if (response != null && response.getHits().getHits().length > 0) {for(SearchHit hit : response.getHits().getHits()) {//TODO

}

//拿到游标

scrollId=response.getScrollId();

}

//一直查询,直到没有游标返回(查询到底了)while (true){if(scrollId == null){break;

}

SearchScrollRequest searchScrollRequest= new SearchScrollRequest(scrollId).scroll(TimeValue.timeValueMinutes(5));;

response=client.searchScroll(searchScrollRequest);if (response != null && response.getHits().getHits().length > 0) {for(SearchHit hit : response.getHits().getHits()) {//TODO

}

scrollId=response.getScrollId();

}else{break;

}

}

到这里,游标查询的基本操作就OK了.有一点需要注意:

游标的方式,相当于mysql中生成快照的方式,所以如果在游标查询期间有增删改操作,是获取不到最新的数据的.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch 使用游标(Cursor)机制是为了在大量数据分页查询时提供一种高效的方式来逐条获取结果,而不需要一次性加载所有结果到内存中,特别适合处理大数据集。当从 Elasticsearch 中检索大型文档集合时,你可以使用 `scroll` 或 `search_after` API。 1. **Scroll API**:这是传统的游标方式,在客户端维护一个持续查询的生命周期,通过设置一个时间窗口(比如 `scroll_size` 和 `scroll_timeout`),服务器返回部分结果,并在请求中附带一个 `scroll_id`,直到所有的结果都被遍历完或超过指定的滚动时间,这时需要发送一个新的 scroll 请求终止当前查询。 示例: ``` GET _search { "size": 10, "scroll": "5m", "query": {...} } GET _search/scroll?scroll=5m&scroll_id=<scroll_id> ``` 2. **Search After API**:这是一种更现代、资源友好的方式,它返回查询结果以及用于下一次搜索的“after”值,这样可以避免多次滚动。当你完成遍历时,不再需要发起新的请求,而是直接关闭搜索。 示例: ``` GET _search { "size": 0, "sort": [{"_id": {"order": "asc"}}], "aggs": {...}, "search_after": [...] } ``` 在查询响应中,找到 `_scroll_id` 并将下一次查询的 `search_after` 设置为上一次的 `next_after` 值。 使用游标时,你应该注意合理设置大小、滚动时间和频率,以避免不必要的网络通信和潜在的性能问题。同时,也要确保在不需要的时候及时停止滚动,释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值