ElasticSearch分页查询的实现
1、设置mapping
PUT /t_order
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings" : {
"properties" : {
"cancel_reason" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"cancel_time" : {
"type" : "date"
},
"create_time" : {
"type" : "date"
},
"create_user" : {
"type" : "long"
},
"delivery_type" : {
"type" : "byte"
},
"discount_amount" : {
"type" : "integer"
},
"expired_time" : {
"type" : "date"
},
"id" : {
"type" : "long"
},
"is_deleted" : {
"type" : "byte"
},
"is_pay" : {
"type" : "byte"
},
"is_postsale" : {
"type" : "byte"
},
"order_amount" : {
"type" : "integer"
},
"order_code" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"order_remark" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"order_status" : {
"type" : "byte"
},
"pay_amount" : {
"type" : "integer"
},
"pay_time" : {
"type" : "date"
},
"pay_type" : {
"type" : "byte"
},
"postage" : {
"type" : "integer"
},
"product_amount" : {
"type" : "integer"
},
"serial_code" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"shop_id" : {
"type" : "long"
},
"update_time" : {
"type" : "date"
},
"update_user" : {
"type" : "long"
},
"user_id" : {
"type" : "long"
}
}
} POST /t_order/_search
{
"query": {
"match_all": {}
}
}
2、添加测试数据
POST /t_order/_bulk
{
"id": 202208780570360889300,
"order_code": "20222379790329301675",
"order_amount": 1,
"pay_amount": 1,
"discount_amount": 0,
"product_amount": 1,
"order_status": 0,
"is_deleted": 0,
"user_id": 202208761977967681500,
"shop_id": 117979,
"expired_time": 1648558094000,
"postage": 0,
"cancel_time": 1648556595000,
"cancel_reason": "订单逾期未支付系统自动取消订单",
"order_remark": "",
"delivery_type": 2,
"pay_time": null,
"pay_type": 1,
"is_pay": 0,
"is_postsale": 0,
"create_time": 1648556294000,
"create_user": 1508761977967681500,
"update_time": 1648556595000,
"update_user": 999999
}
3、演示(show me the code):
### from + size [深度翻页不推荐使用 From + size]
#from + size 两个参数定义了结果页面显示数据的内容。
#from:未指定,默认值是 0,注意不是1,代表当前页返回数据的起始值。
#size:未指定,默认值是 10,代表当前页返回数据的条数。
POST /ds-trade_t_order/_search
{
"from": 0,
"size": 20,
"query": {
"match_all": {}
}
}
### searchAfter [官方文档强调:不再建议使用scroll API进行深度分页。如果要分页检索超过 Top 10,000+ 结果时,推荐使用:PIT + search_after。]
#part1:创建 PIT 视图,这是前置条件不能省。
POST /ds-trade_t_order/_pit?keep_alive=5m
#part2:创建基础查询语句,这里要设置翻页的条件。
POST /_search
{
"size": 20,
"track_total_hits": true,
"query": {
"match_all": {}
},
"pit": {
"id": "l9G1AwEQZHMtdHJhZGVfdF9vcmRlchY2M3VFTm9uZ1RrT1ltbWx5RDZvQllnABZaeDFQbHhSMVJGNktBZm5kakxqYTZBAAAAAAAAIhFCFml1Uy1Kb21pU2Zxdlc4OHhfWE1aSkEAARY2M3VFTm9uZ1RrT1ltbWx5RDZvQllnAAA="
},
"sort": [
{
"create_time": {
"order": "desc"
}
}
]
}
#part3:实现后续翻页:后续翻页都需要借助 search_after 指定前一页的最后一个文档的 sort 字段值。
POST /_search
{
"size": 20,
"track_total_hits": true,
"query": {
"match_all": {}
},
"pit": {
"id": "l9G1AwEQZHMtdHJhZGVfdF9vcmRlchY2M3VFTm9uZ1RrT1ltbWx5RDZvQllnABZaeDFQbHhSMVJGNktBZm5kakxqYTZBAAAAAAAAIhFCFml1Uy1Kb21pU2Zxdlc4OHhfWE1aSkEAARY2M3VFTm9uZ1RrT1ltbWx5RDZvQllnAAA="
},
"sort": [
{
"create_time": {
"order": "desc"
}
}
],
"search_after": [
1648557674000,
7
]
}
###scroll [全量或数据量很大时遍历结果数据,而非分页查询。]
#part1:指定检索语句同时设置 scroll 上下文保留时间
POST /t_order/_search?scroll=3m
{
"size": 20,
"query": {
"match_all": {}
}
, "sort": [
{
"create_time": {
"order": "desc"
}
}
]
}
#part2:指定检索语句同时设置 scroll 上下文保留时间
POST /_search/scroll
{
"scroll":"3m",
"scroll_id":"FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFml1Uy1Kb21pU2Zxdlc4OHhfWE1aSkEAAAAAACIXbhZaeDFQbHhSMVJGNktBZm5kakxqYTZB"
}
总结:
From+ size:需要随机跳转不同分页(类似主流搜索引擎)、Top 10000 条数据之内分页显示场景。
search_after:仅需要向后翻页的场景及超过Top 10000 数据需要分页场景。
Scroll:需要遍历全量数据场景 。而非翻页的场景(翻页场景scrol id 最多打开500个)。
max_result_window:调大治标不治本,不建议调过大。
PIT:本质是视图。
另外:根据实际经验得出一些参考意见:
1、search_after pit 不适用于商品列表分页查询(类似京猫这种商品列表),因为用户从商品列表进入商品详情,长时间停留在详情页查看后,返回商品列表继续翻页,此时
keep_alive 已经过期,出现无法翻页的错误。
2、Scroll 也会有上述问题。同时scroll也会有连接过多的问题,不适用于分页场景。
To prevent against issues caused by having too many scrolls open, the user is not allowed to open scrolls past a certain limit. By default,
the maximum number of open scrolls is 500. This limit can be updated with the search.max_open_scroll_context cluster setting.
参考资料————————————————
版权声明:本文为CSDN博主「铭毅天下」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/laoyang360/article/details/116472697
ElasticSearch分页查询的实现的更多相关文章
- elasticsearch 分页查询实现方案——Top K+归并排序
elasticsearch 分页查询实现方案 1. from+size 实现分页 from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10,注意:size的大小不能超 ...
- Elasticsearch——分页查询From&Size VS scroll
Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回.那么,如果要实现分页查询该怎么办呢? 更多内容参考Elasticsearch资料汇总 按照一般的查询 ...
- ElasticSearch—分页查询
ElasticSearch查询—分页查询详解 Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回.那么,如何实现分页查询呢? 按照一般的查询流程来说,如 ...
- elasticsearch 分页查询实现方案
1. from+size 实现分页 from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10, 注意:size的大小不能超过index.max_result_wind ...
- ElasticSearch——分页查询
前言 ElasticSearch实现分页查询,有3种方式,他们在数据查询中各自占据着不同的优势,因此在搜索引擎的数据分页过程中,如何更好地利用各自的优势来进行数据查询是一个非常重要的过程. 传统分页( ...
- Elasticsearch 分页查询
目录 前言 from + size search after scroll api 总结 参考资料 前言 我们在实际工作中,有很多分页的需求,商品分页.订单分页等,在MySQL中我们可以使用limit ...
- Elasticsearch分页查询
global index global CLIENT index = "guajibao-ipused-2019.10.13" CLIENT = Elasticsearch(hos ...
- Elasticsearch教程(九) elasticsearch 查询数据 | 分页查询
Elasticsearch 的查询很灵活,并且有Filter,有分组功能,还有ScriptFilter等等,所以很强大.下面上代码: 一个简单的查询,返回一个List<对象> .. ...
- elasticsearch查询之大数据集分页查询
一. 要解决的问题 search命中的记录特别多,使用from+size分页,直接触发了elasticsearch的max_result_window的最大值: { "error" ...
- Elasticsearch from/size-浅分页查询-深分页 scroll-深分页search_after深度查询区别使用及应用场景
Elasticsearch调研深度查询 1.from/size 浅分页查询 一般的分页需求我们可以使用from和size的方式实现,但是这种的分页方式在深分页的场景下应该是避免使用的.深分页的页次增加 ...
随机推荐
- NC23482 小A的最短路
题目链接 题目 题目描述 小A这次来到一个景区去旅游,景区里面有N个景点,景点之间有N-1条路径.小A从当前的一个景点移动到下一个景点需要消耗一点的体力值.但是景区里面有两个景点比较特殊,它们之间是可 ...
- POJ1080 滑雪
题目链接 题目 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Mi ...
- 【XInput】游戏手柄模拟鼠标动作
老周一般很少玩游戏,在某宝上买了一堆散件,计划在过年期间自己做个机械臂耍耍.头脑中划过一道紫蓝色的闪电,想起用游戏手柄来控制机械臂.机械臂是由树莓派(大草莓)负责控制,然后客户端通过 Socket U ...
- Vue DevTools 安装和浏览器跳转到编辑器指定组件
Vue DevTools install and Open component in editor 1.在谷歌浏览器安装vue 插件 1.1下载vue插件 链接:https://pan.baidu.c ...
- Java的协程Quasar
协程是对函数和线程进一步优化的产物, 是一种函数的编排方式, 将传统意义上的函数拆成更小粒度的过程. 简单说, 就是比函数粒度还要小的可手动控制的过程. 协程可以通过yield 来调用其它协程,接下来 ...
- display的值及作用
display的值及作用 display属性可以设置元素的内部和外部显示类型,元素的外部显示类型将决定该元素在流式布局中的表现,例如块级或内联元素,元素的内部显示类型可以控制其子元素的布局,例如gri ...
- 实操开源版全栈测试工具RunnerGo安装(一)
Docker版安装文档 一.环境要求 1.1 部署服务器要求 操作系统:任何支持 Docker 的 Linux x86 CPU内存:最低要求 4C8G,推荐 8C16G 网络要求:可访问互联网 ...
- 启动HDFS伪分布式环境时报权限错误
问题描述 操作系统:Ubuntu18.04 LTS HDFS版本:hadoop-3.2.3 普通用户登录,参照官方文档在单机上安装伪分布式环境时,启动HDFS报权限错误. 具体报错信息如下: $ ./ ...
- 禁用Windows自动更新并允许手动更新
新版的 Windows 经常会自动检查更新,然后在某个夜深人静的晚上帮你自动更新. 对于自动更新,一般的解决方案是直接禁用 Windows 更新服务.这种方式虽然关闭了自动更新,但会影响手动更新.Wi ...
- 第130篇:BOM(window对象)
好家伙,本篇为<JS高级程序设计>第十二章"BOM"学习笔记 什么是BOM? BOM(Browser Object Model) 是指浏览器对象模型,是用于描述这种 ...