ElasticSearch第六讲 ES 三种分页查询from+size / Scroll /search_after

我的Git地址:https://gitee.com/ITLULU 欢迎访问

ES的分页查询和关系数据库的分页查询的区别:

ES分页查询有以下几种:
1:简单的 from size (有默认的最大Size,不可无限大小查询,因为数据过多查询性能会降低,且也要考虑内存问题,以及OS缓存数据的能力)
2: scroll基于查询窗口的高效大量数据深分页查询
3:search_after 深查询
Mysql的分页查询
limit m,n形式 跳过前m条数据,读取n条数据

select * from table order by id limit m, n;
很简单,该语句的意思就是查询m+n条记录,去掉前m条,返回后n条。无疑该查询能够实现分页,但m越大,查询性能就越低,因为MySQL需要扫描全部m+n条记录。

下面结合具体的实例进行讲解:

话不多说,还是以往的风格,直接上实例,根据具体的例子来分析,现

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果利用 `from` 和 `size` 进行分页查询,可能会出现数据不一致的情况。这是因为在 Elasticsearch 中,数据是分布式存储的,而分页查询是基于分片进行的。当一个查询跨越多个分片时,由于不同分片数据的不同,可能会导致数据不一致的情况。 解决这个问题的方法是,使用 Search After API 来进行分页查询Search After API 可以在查询结果中保留一个游标,可以在下一次查询中使用该游标来继续查询,从而确保数据一致性。 具体的做法是,在第一次查询时,使用 `sort` 参数对结果进行排序,并记录最后一条结果的排序值(可以是 `_id` 或其他字段)。在下一次查询时,使用 `search_after` 参数来指定排序值,以继续查询下一页数据。这样就可以确保每一页的数据是连续的,不会出现重复或遗漏的情况。 以下是使用 Search After API 进行分页查询的示例代码: ``` SearchRequest searchRequest = new SearchRequest("index_name"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); searchSourceBuilder.sort("_id", SortOrder.ASC); searchSourceBuilder.size(pageSize); if (page > 1) { // 使用 search_after 参数来指定排序值,以继续查询下一页 searchSourceBuilder.searchAfter(lastSortValues); } searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = searchResponse.getHits(); if (hits.getTotalHits().value > 0) { SearchHit[] searchHits = hits.getHits(); for (SearchHit hit : searchHits) { // 处理查询结果 } // 记录最后一条结果的排序值,以供下一页查询使用 lastSortValues = searchHits[searchHits.length - 1].getSortValues(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员路同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值