详解SpringCloud微服务技术栈:ElasticSearch搜索结果处理(排序、分页、高亮)

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习
🌌上期文章:详解SpringCloud微服务技术栈:DSL查询ES文档高级语法、相关性算分数学原理总结
📚订阅专栏:微服务技术全家桶
希望文章对你们有所帮助

这一部分学习我觉得也还是挺重要的,而且是开发过程中经常会遇到的需求,把这些DSL语句了解清楚是很重要的。

ElasticSearch搜索结果处理

  • 排序
  • 分页
  • 高亮

排序

ElasticSearch本身就带有排序,支持对搜索的结果进行排序,默认根据相关度算分(_score)排序,分数越高排名越靠前。
但是很多时候我们可能需要对价格、日期等进行排序,因此我们也可以自己设定排序的规则,而不是将其加入进行相关度算分。
常见的排序字段类型有简单类型的、地理坐标类型的,分别进行举例:
1、对酒店数据按照用户评价降序排序,评价相同的按照价格升序排序:

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "score": "desc"
    },
    {
      "price": "asc"
    }
  ]
}

2、对酒店数据按照到某位置坐标的距离进行升序排序

GET /hotel/_search
{
  "query":{
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance": {
        "location": {
          "lat": 31.034661,
          "lon": 121
        },
        "order": "asc",
        "unit": "km"
      }
    }
  ]
}

分页

ElasticSearch默认情况下只返回10条数据,而如果要查询更多数据就需要修改分页参数。ElasticSearch通过修改from(分页开始的位置,默认为0)、size参数(期望获取的文档总数)来控制要返回的分页结果:

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ],
  "from": 0,
  "size": 10
}

如果想看第二页,那就把from的值赋为10即可。

其实这种分页的效果跟MySQL很像,但是其底层是有很大的区别的,因为ES因为底层是倒排索引,并不像MySQL那样容易做分页,所以ES的分页实际上是逻辑分页。

例如,当我们要获取990-1000的数据,实际上会先进行排序并获取1000条数据,然后截取990-1000条文档。

底层数据结构决定了这一点,并没有办法改变,在单点进行这种操作的时候没有关系,但是当ElasticSearch是集群部署的时候(ES是分布式的),就会将所有文档进行拆分,放到不同的ES上,称为分片,这时候没办法从所有的集群中获取到这前1000条数据。

简单来说,在某个分片上的前1000条文档,放在所有的文档中很可能不是前1000,一种解决方式是从所有分片中获取前1000条文档做聚合,再重新排序并选取出前1000名。

但是如果搜索页数过深或者结果集越大,对内存、CPU消耗也大,因此ES设置了结果集的查询上限为10000。如此的话,我们应该尽量从业务层面就不要超出这个查询的上限。

而针对深度分页,ES也提供了解决方案:

search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。

高亮

高亮即在搜索结果中把搜索关键字突出显示,例如百度的搜索。
能够实现这样的搜索后高亮肯定不是前端代码去做的,做这件事的就是服务器端,具体来说就是ElasticSearch。
底层原理:

1、将搜索结果的关键字用标签标记出来
2、在页面中给标签添加CSS样式

例如,我们现在需要搜索所有文档中的信息中带着“如家”的酒店,那匹配的字段直接使用all即可,但是ES的搜索默认搜索的字段要与高亮的字段一致,只需要将require_field_match置为false即可:

GET /hotel/_search
{
  "query": {
    "match": {
      "all": "如家"
    }
  },
  "highlight": {
    "fields": {
      "name": {
        "require_field_match": "false"
      }
    }
  }
}

在这里插入图片描述
需要注意的是,上述代码中的"name"可以写为:

"name":{
	"pre_tags": "<em>", # 标记高亮字段的前置标签
	"post_tags": "</em>" # 标记高亮字段的后置标签
}

而默认就是用这个标签实现的高亮。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/352261.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【华为 ICT HCIA eNSP 习题汇总】——题目集9

1、缺省情况下&#xff0c;广播网络上 OSPF 协议 Hello 报文发送的周期和无效周期分别为&#xff08;&#xff09;。 A、10s&#xff0c;40s B、40s&#xff0c;10s C、30s&#xff0c;20s D、20s&#xff0c;30s 考点&#xff1a;①路由技术原理 ②OSPF 解析&#xff1a;&…

Android源码设计模式解析与实战第2版笔记(一)

第一章 走向灵活软件之路 — 面向对象的六大原则 优化代码的第一步 — 单一职责原则 单一职责原则的英文名称是Single Responsibility Principle&#xff0c;缩写是SRP。 SRP&#xff1a;就一个类而言&#xff0c;应该仅有一个引起它变化的原因。 一个类中应该是一组相关性很…

Elasticsearch:使用 Gemini、Langchain 和 Elasticsearch 进行问答

本教程演示如何使用 Gemini API创建 embeddings 并将其存储在 Elasticsearch 中。 我们将学习如何将 Gemini 连接到 Elasticsearch 中存储的私有数据&#xff0c;并使用 Langchian 构建问答功能。 准备 Elasticsearch 及 Kibana 如果你还没有安装好自己的 Elasticsearch 及 Ki…

小游戏选型(二):第三方社交小游戏厂家对比,即构/声网/融云/云信等

前言&#xff1a; 上一篇文章我们主要介绍社交游戏化趋势&#xff0c;并分析了直播平台面临的买量贵、变现难等问题&#xff0c;探讨了小游戏作为新的运营变现玩法的优势。同时还列举了各大直播平台TOP5的小游戏。今天我们继续介绍小游戏系列内容&#xff0c;本文是该系列的第…

力扣算法-Day20

541. 反转字符串II 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0c…

确定软件项目范围基准 5个重点

软件项目范围基准明确了项目的边界、目标和主要交付成果&#xff0c;有助于提高项目成本、进度和资源估算的准确性&#xff0c;便于实施项目控制&#xff0c;而且还可以帮助我们清楚分派责任&#xff0c;防止范围蔓延&#xff0c;从而提升项目的成功率。 如果没有明确确定范围基…

Java复习系列之阶段二:数据库

1. 基础语法 1.1 DQL&#xff08;数据查询语句&#xff09; 执行顺序&#xff1a; from、join 、on、where、group by、having、select、distinct、order by、limit 1.2 DML&#xff08;数据修改语言&#xff09; 对数据表的增删改 insert into update set delete form 1.…

数模.聚类模型

一、前言 二、K-means聚类算法 下面是针对量纲不同进行的操作 三、系统聚类 spass操作 spass操作 总结&#xff1a;最好使用系统聚类算法&#xff0c;在论文上写的的内容更加充实&#xff0c;图片也较多 四、DBSCAN算法 适用于这种比较有规律的。 这种算法使用很少。不建议使用…

喝酒筛子小游戏集合源码微信小程序喝酒骰子程序带流量主版本源码酒桌玩筛子源码

2023新版酒桌小游戏喝酒小程序源码-&#xff08;流量主版本&#xff09; 修改增加了广告位 根据文档直接替换&#xff0c;原版本没有广告位 直接上传源码到开发者端即可 通过后改广告代码&#xff0c;然后关闭广告展示提交&#xff0c;通过后打开即可 无广告引流 流量主版…

签到业务流程

1.技术选型 Redis主写入查询&#xff0c;Mysql辅助查询&#xff0c;传统签到多数都是直接采用mysql为存储DB,在大数据的情况下数据库的压力较大.查询速率也会随着数据量增大而增加.所以在需求定稿以后查阅了很多签到实现方式,发现用redis做签到会有很大的优势.本功能主要用到r…

git:使用git rebase合并多次commit为一个

git log&#xff1a;找到需要合并的最早 commit 的父级 git rebase -i 73a5cd8597除第一个 pick 外&#xff0c;将其它改成 s&#xff0c;改完后保存退出 保存完后弹出 commit message 合并提示&#xff0c;根据这次合并的目的&#xff0c;重写commit message&#xff0c;改完后…

计算机中丢失mfc100u.dll怎么解决,详细解析mfc100u.dll丢失的解决方法

遭遇“无法找到mfc100u.dll”的错误不必过分担忧&#xff0c;这是一个普遍现象。许多用户在启动某些软件或游戏的时候可能会碰到这样的情况。通常&#xff0c;这个错误信息表明你的计算机系统中缺失了一个关键的动态链接库(DLL)文件&#xff0c;它可能会妨碍应用程序的顺利启动…

Android读写文件,适配Q以上

Android Q升级了文件系统&#xff0c;访问文件不仅仅是说动态权限了&#xff0c;有各种限制。权限什么的就不赘述了&#xff0c;下面介绍一下在10以上的系统中访问文件。 首先是打开文件管理器 /*** 打开文件管理器 存储卡和外接U盘都可以访问*/public void openFileManager()…

没指定spring-boot-maven-plugin版本导致编译失败,这坑你踩过没

文章目录 1. 前言2. 组件版本信息3. 事件经过3.1 本地通过maven命令打包3.2 定位问题步骤3.2.1 核对spring-boot-maven-plugin版本信息3.2.2 spring-boot-maven-plugin版本错误原因 3.3 解决方案 4.结论 1. 前言 我们在平时开发过程中关注的比较多的是项目开发时依赖包的版本以…

为什么选择快速应用开发:提高业务响应速度与竞争力的关键

如今&#xff0c;企业想要持续蓬勃发展&#xff0c;就需要具备快速满足客户期望的能力。无论是十几年历史的重要市场占有者推出新的APP&#xff0c;还是在疫情期间从线下转向线上电商营销&#xff0c;企业都需要主动适应市场。随着为客户提供新的服务方式&#xff0c;员工也需要…

【LUA】mac状态栏添加天气

基于网络上的版本修改的&#xff0c;找不到出处了。第一个摸索的lua脚本&#xff0c;调了很久。 主要修改&#xff1a;如果风速不大&#xff0c;就默认不显示&#xff0c;以及调整为了一些格式 local urlApi http://.. --这个urlApi去申请个免费的就可以了 然后打开对应的json…

Scratch:启蒙少儿编程的图形化魔法

在当今这个数字化时代&#xff0c;编程已经成为了一项重要的基础技能。就像学习阅读和写作一样&#xff0c;掌握编程能够打开通往未来世界的大门。对于孩子们来说&#xff0c;Scratch作为一种图形化编程语言&#xff0c;不仅简单有趣&#xff0c;而且非常适合作为编程学习的入门…

Vue3 Suspense 优雅地处理异步组件加载

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

基于51单片机智能电子秤

实物显示效果&#xff1a; https://www.bilibili.com/video/BV1Wb4y1A7Aw/?vd_source6ff7cd03af95cd504b60511ef9373a1d 功能介绍&#xff1a; &#xff08;1&#xff09;用键盘设计单价&#xff1b; &#xff08;2&#xff09;称重后同时显示该物品的重量、单价和总额&…

JAVA编程题之用户登录,用户信息存储在本地文件

实现用户登录&#xff1a;键盘输入要登录的用户名与密码 properties类型文件常在框架内用作配置文件. public static void main(String[] args) throws Exception {FileInputStream fis new FileInputStream("user.properties");Properties properties new Prope…