微服务框架 SpringCloud微服务架构 23 搜索结果处理 23.2 分页
创始人
2024-03-25 18:44:11

微服务框架

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】

SpringCloud微服务架构

文章目录

      • 微服务框架
      • SpringCloud微服务架构
      • 23 搜索结果处理
        • 23.2 分页
          • 23.2.1 分页
          • 23.2.2 深度分页问题
          • 23.2.3 深度分页解决方案
          • 23.2.4 总结

23 搜索结果处理

23.2 分页

23.2.1 分页

elasticsearch 默认情况下只返回top10的数据。而如果要查询更多数据就需要修改分页参数了。

elasticsearch中通过修改from、size参数来控制要返回的分页结果:

之前默认查询所有文档,默认显示10条,就是因为ES 底层有一个默认的分页参数

【语法】

GET /hotel/_search
{"query": {"match_all": {}},"from": 990, // 分页开始的位置,默认为0"size": 10, // 期望获取的文档总数"sort": [{"price": "asc"}]
}

在这里插入图片描述

试试

# 分页查询
GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"price": "asc"}],"from": 0,"size": 3
}

查询第一页,每页三条

运行结果

在这里插入图片描述

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 201,"relation" : "eq"},"max_score" : null,"hits" : [{"_index" : "hotel","_type" : "_doc","_id" : "197837109","_score" : null,"_source" : {"address" : "布吉镇深惠路龙珠商城","brand" : "如家","business" : "布吉/深圳东站","city" : "深圳","id" : 197837109,"location" : "22.602482, 114.123284","name" : "如家酒店·neo(深圳龙岗大道布吉地铁站店)","pic" : "https://m.tuniucdn.com/fb2/t1/G6/M00/25/58/Cii-TF3PFZOIA7jwAAKInGFN4xgAAEVbAGeP4AAAoi0485_w200_h200_c1_t0.jpg","price" : 127,"score" : 43,"starName" : "二钻"},"sort" : [127]},{"_index" : "hotel","_type" : "_doc","_id" : "2316304","_score" : null,"_source" : {"address" : "龙岗街道龙岗墟社区龙平东路62号","brand" : "如家","business" : "龙岗中心区/大运新城","city" : "深圳","id" : 2316304,"location" : "22.730828, 114.278337","name" : "如家酒店(深圳双龙地铁站店)","pic" : "https://m.tuniucdn.com/fb3/s1/2n9c/4AzEoQ44awd1D2g95a6XDtJf3dkw_w200_h200_c1_t0.jpg","price" : 135,"score" : 45,"starName" : "二钻"},"sort" : [135]},{"_index" : "hotel","_type" : "_doc","_id" : "1630005459","_score" : null,"_source" : {"address" : "罗湖区宝安南路2078号深港豪苑(与红桂路交汇处)","brand" : "7天酒店","business" : "","city" : "深圳","id" : 1630005459,"location" : "22.550341, 114.10965","name" : "7天连锁酒店(深圳地王大厦红桂路店)(原红桂路店)","pic" : "https://m.tuniucdn.com/fb2/t1/G2/M00/EA/18/Cii-T1k1KaGIIkQVAAD4fD_T3FcAALTtABiCJ8AAPiU164_w200_h200_c1_t0.jpg","price" : 143,"score" : 39,"starName" : "二钻"},"sort" : [143]}]}
}

看第二页

# 分页查询
GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"price": "asc"}],"from": 3,"size": 3
}

运行结果

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 201,"relation" : "eq"},"max_score" : null,"hits" : [{"_index" : "hotel","_type" : "_doc","_id" : "541619","_score" : null,"_source" : {"address" : "莘庄镇莘浜路172号","brand" : "如家","business" : "莘庄工业区","city" : "上海","id" : 541619,"location" : "31.105797, 121.37755","name" : "如家酒店(上海莘庄地铁站龙之梦商业广场店)","pic" : "https://m.tuniucdn.com/fb3/s1/2n9c/3mKs3jETvJDj3dDdkRB9UyLLvPna_w200_h200_c1_t0.jpg","price" : 149,"score" : 44,"starName" : "二钻"},"sort" : [149]},{"_index" : "hotel","_type" : "_doc","_id" : "1400304687","_score" : null,"_source" : {"address" : "龙岗大道横岗段4004号","brand" : "如家","business" : "龙岗中心区/大运新城","city" : "深圳","id" : 1400304687,"location" : "22.642629, 114.202799","name" : "如家酒店(深圳横岗地铁站新马商贸城店)","pic" : "https://m.tuniucdn.com/fb2/t1/G6/M00/25/5A/Cii-TF3PFkiIb27dAAEqdDcKl3YAAEViQGVWY0AASqM960_w200_h200_c1_t0.jpg","price" : 149,"score" : 43,"starName" : "二钻"},"sort" : [149]},{"_index" : "hotel","_type" : "_doc","_id" : "728415","_score" : null,"_source" : {"address" : "晒布路67号","brand" : "如家","business" : "东门商业区","city" : "深圳","id" : 728415,"location" : "22.550183, 114.120771","name" : "如家酒店·neo(深圳东门步行街晒布地铁站店)","pic" : "https://m.tuniucdn.com/fb2/t1/G6/M00/25/57/Cii-U13PFNWISSnQAAEpTtoilsQAAEVWgEvur8AASlm647_w200_h200_c1_t0.jpg","price" : 152,"score" : 46,"starName" : "二钻"},"sort" : [152]}]}
}

没毛病

23.2.2 深度分页问题

ES是分布式的【集群】,所以会面临深度分页问题。

例如按price排序后,获取from = 990,size =10的数据:

在这里插入图片描述

  1. 首先在每个数据分片上都排序并查询前1000条文档。

  2. 然后将所有节点的结果聚合,在内存中重新排序选出前1000条文档

  3. 最后从这1000条中,选取从990开始的10条文档

如果搜索页数过深,或者结果集(from + size)越大,对内存和CPU的消耗也越高。因此ES设定结果集查询的上限是10000

试试阈值

在这里插入图片描述

这样还没问题,+ 1

在这里插入图片描述

直接报错了

在这里插入图片描述

就是这样

【那万一真有这样的需求咋办?就没办法解决了吗?】【当然是有的】

23.2.3 深度分页解决方案

针对深度分页,ES提供了两种解决方案,官方文档:

在这里插入图片描述

  • search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。
  • scroll:原理将排序数据形成快照,保存在内存。【内存消耗太大了】官方已经不推荐使用。
23.2.4 总结

from + size:

  • 优点:支持随机翻页
  • 缺点:深度分页问题,默认查询上限(from + size)是10000
  • 场景:百度、京东、谷歌、淘宝这样的随机翻页搜索

after search:

  • 优点:没有查询上限(单次查询的size不超过10000)
  • 缺点:只能向后逐页查询,不支持随机翻页
  • 场景:没有随机翻页需求的搜索,例如手机向下滚动翻页

scroll:

  • 优点:没有查询上限(单次查询的size不超过10000)
  • 缺点:会有额外内存消耗,并且搜索结果是非实时的
  • 场景:海量数据的获取和迁移。从ES7.1开始不推荐,建议用 after search方案。

相关内容

热门资讯

应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...