微服务分布式搜索引擎 ElasticSearch 搜索结果处理 排序、分页与高亮

news2024/9/28 13:22:51

文章目录

  • ⛄引言
  • 一、排序
    • ⛅普通字段排序
    • ⚡地理坐标排序
  • 二、分页
    • ⌚基本分页
    • ⏰深度分页
  • 三、高亮
    • ⚡实现高亮
  • ⛵小结

⛄引言

本文参考黑马 分布式Elastic search
Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容

搜索结果处理

搜索的结果可以按照用户指定的方式去处理或展示。

一、排序

elasticsearch默认是根据相关度算分(_score)来排序,但是也支持自定义方式对搜索结果排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

⛅普通字段排序

keyword、数值、日期类型排序的语法基本一致。

语法

GET /indexName/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "FIELD": "desc"  // 排序字段、排序方式ASC、DESC
    }
  ]
}

排序条件是一个数组,也就是可以写多个排序条件。按照声明的顺序,当第一个条件相等时,再按照第二个条件排序,以此类推

示例

需求描述:酒店数据按照用户评价(score)降序排序,评价相同的按照价格(price)升序排序

在这里插入图片描述

⚡地理坐标排序

地理坐标排序略有不同。

语法说明:

GET /indexName/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance" : {
          "FIELD" : "纬度,经度", // 文档中geo_point类型的字段名、目标坐标点
          "order" : "asc", // 排序方式
          "unit" : "km" // 排序的距离单位
      }
    }
  ]
}

这个查询的含义是:

  • 指定一个坐标,作为目标点
  • 计算每一个文档中,指定字段(必须是geo_point类型)的坐标 到目标点的距离是多少
  • 根据距离排序

示例:

需求描述:实现对酒店数据按照到你的位置坐标的距离升序排序

提示:获取你的位置的经纬度的方式:https://lbs.amap.com/demo/jsapi-v2/example/map/click-to-get-lnglat/

假设我的位置是:22.537148, 114.051375 寻找我周围距离最近的酒店。

在这里插入图片描述

二、分页

elasticsearch 默认情况下只返回top10的数据。而如果要查询更多数据就需要修改分页参数了。elasticsearch中通过修改from、size参数来控制要返回的分页结果:

  • from:从第几个文档开始
  • size:总共查询几个文档

类似于mysql中的limit ?, ?

⌚基本分页

分页的基本语法如下:

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

执行查询结果

在这里插入图片描述

⏰深度分页

现在,我要查询990~1000的数据,查询逻辑要这么写:

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

这里是查询990开始的数据,也就是 第990~第1000条 数据。

不过,elasticsearch内部分页时,必须先查询 0~1000条,然后截取其中的990 ~ 1000的这10条:

在这里插入图片描述

查询TOP1000,如果es是单点模式,这并无太大影响。

但是elasticsearch将来一定是集群,例如我集群有5个节点,我要查询TOP1000的数据,并不是每个节点查询200条就可以了。

因为节点A的TOP200,在另一个节点可能排到10000名以外了。

因此要想获取整个集群的TOP1000,必须先查询出每个节点的TOP1000,汇总结果后,重新排名,重新截取TOP1000。

在这里插入图片描述

那如果我要查询9900~10000的数据呢?是不是要先查询TOP10000呢?那每个节点都要查询10000条?汇总到内存中?

当查询分页深度较大时,汇总数据过多,对内存和CPU会产生非常大的压力,因此elasticsearch会禁止from+ size 超过10000的请求。

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

  • search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。
  • scroll:原理将排序后的文档id形成快照,保存在内存。官方已经不推荐使用。

分页小结

分页查询的常见实现方案以及优缺点:

  • from + size

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

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

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

三、高亮

什么是高亮显示呢?

我们在百度,京东搜索时,关键字会变成红色,比较醒目,这叫高亮显示:

在这里插入图片描述

高亮显示的实现分为两步:

  • 1)给文档中的所有关键字都添加一个标签,例如<em>标签
  • 2)页面给<em>标签编写CSS样式

⚡实现高亮

高亮的语法:

GET /hotel/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT" // 查询条件,高亮一定要使用全文检索查询
    }
  },
  "highlight": {
    "fields": { // 指定要高亮的字段
      "FIELD": {
        "pre_tags": "<em>",  // 用来标记高亮字段的前置标签
        "post_tags": "</em>" // 用来标记高亮字段的后置标签
      }
    }
  }
}

注意:

  • 高亮是对关键字高亮,因此搜索条件必须带有关键字,而不能是范围这样的查询。
  • 默认情况下,高亮的字段,必须与搜索指定的字段一致,否则无法高亮
  • 如果要对非搜索字段高亮,则需要添加一个属性:required_field_match=false

搜索结果

在这里插入图片描述

高亮小结

查询的DSL是一个大的JSON对象,包含下列属性:

  • query:查询条件
  • from和size:分页条件
  • sort:排序条件
  • highlight:高亮条件

示例:

在这里插入图片描述

⛵小结

以上就是【Bug 终结者】对 微服务分布式搜索引擎 Elastic Search RestClient 操作文档 的简单介绍,ES搜索引擎无疑是最优秀的分布式搜索引擎,使用它,可大大提高项目的灵活、高效性! 技术改变世界!!!

如果这篇【文章】有帮助到你,希望可以给【Bug 终结者】点个赞👍,创作不易,如果有对【后端技术】、【前端领域】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【Bug 终结者】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💝💝💝!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 实现模糊聚类

python模糊聚类细节与实现 前言数学逻辑代码框架Python实现数据预处理 preProcess获得相似矩阵 getSimilarityMatrix获取传递闭包 transitiveClosure模糊运算 fuzzMatrixProduct实现聚类 mergeProcess 实例演示 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b062c59c282…

【Redis】持久化机制详解:从RDB到AOF,你需要知道的一切

本文目录 RDB&#xff08;默认&#xff09; 自动触发 &#x1f19a; 手动触发 优点 缺点 何时会触发RDB快照 AOF 启用 AOF 配置路径 AOF 文件&#x1f4c3; AOF 的写回策略 AOF 的重写机制 优点 缺点 RDB & AOF 优先级 终极方案&#xff1a;RDB AOF 混合方…

城市轨道交通自动售检票系统

概述 城市轨道交通自动售检票系统&#xff08;AFC&#xff09;是基于计算机、通信、网络、自动控制等技术&#xff0c;实现轨道交通售票、检票、计费、收费、统计、清分、管理等全过程的自动化系统。可以提高轨道交通的运营效率&#xff0c;满足乘客的快速出行需求&#xff0c…

看完张一鸣近十年微博,我总结了这些成长特质

从程序员到 CEO 关注我的朋友&#xff0c;很多都是技术背景&#xff0c;之前在一个知乎回答里提到过&#xff0c;技术人在创业过程中并不占优势。 编程和创业是两个不同的体系&#xff0c;大部分技术工程师在工作中&#xff0c;解决的往往是一个限定的问题&#xff0c;而创业是…

【分享】ChatGPT的key,用key免费使用ChatGPT(每天更新)

1、ChatGPT用法总结&#xff1a; 自动化文本生成&#xff1a;可以用GPT生成文章、新闻、文本摘要&#xff0c;甚至小说、诗歌等文学作品。语音生成&#xff1a;结合语音合成技术&#xff0c;GPT可以生成自然流畅的语音&#xff0c;可以用于语音助手、交互式语音应用等。问答系统…

MobileViT神经网络模型

官方源码(Pytorch实现) : https://github.com/apple/ml-cvnets 原文链接&#xff1a;https://blog.csdn.net/qq_37541097/article/details/126715733 霹雳吧啦Wz从ml-evnets仓库中剥离的代码: deep-learning-for-image-processing/pytorch_classification/MobileViT at master…

AWE 2023:科技与艺术的结晶 三星展台亮点回顾

2023年4月27~30日&#xff0c;AWE 2023中国家电及消费电子博览会在上海新国际博览中心盛大举行。 作为全球三大消费电子展之一&#xff0c;每一年的AWE都汇聚了全球家电及消费电子领域最前沿、最尖端的科技和产品&#xff0c;因而向来都被业界人士视为整个行业的风向标。本届AW…

【读书笔记】《深入浅出数据分析》

我最大的收获 试想你在经历一场英语考试&#xff0c;还有两分钟就要交卷了&#xff0c;而你还没有开始写作文。此时&#xff0c;你会怎么做&#xff1f; 利用2分钟时间写出的第一段&#xff0c;还是只写关键句子&#xff0c;搭出文章的开头、过程、结尾&#xff1f; 后者更加明…

【LeetCode】91. 解码方法

91. 解码方法&#xff08;中等&#xff09; 思路 这其实是一道字符串类的动态规划题&#xff0c;不难发现对于字符串s的某个位置i而言&#xff0c;我们只关心「位置 i 自己能否形成独立 item」和「位置 i 能够与上一位置&#xff08;i-1&#xff09;能否形成item 」&#xff0c…

无人机测试二维码降落。

一、首先要做的就是让NX板卡驱动usb摄像头&#xff1a; 1. 下载usb_cam软件包 sudo apt install ros-melodic-usb-cam2. 启动相机节点&#xff1a; A. 查找摄像头接口 ls /dev/video*B. 在该路径下修改launch文件&#xff0c;换成你自己的摄像头接口 我这里的摄像头接口为…

PySpark基础入门(3):RDD持久化

RDD的持久化 RDD 的数据是过程数据&#xff0c;因此需要持久化存储&#xff1b; RDD之间进行相互迭代的计算&#xff0c;新的RDD的生成代表着旧的RDD的消失&#xff1b;这样的特性可以最大化地利用资源&#xff0c;老旧地RDD可以及时地从内存中清理&#xff0c;从而给后续地计…

电脑发挥极致,畅游永恒之塔sf

随着22寸显示器的普及&#xff0c;玩永恒之塔势必会对显示卡造成了很大负担。不要说效果全开&#xff0c;就连简洁的玩&#xff0c;都成了问题&#xff0c;那是不是就要重金把才买的显示卡又要拿掉呢&#xff1f; 最出众的解决办法&#xff0c;是超频。 主要就具有以下条件最佳…

Azure DevOps Server 数据还原方式三:增量还原

Contents 1. 概述2. 操作方式 2.1 创建共享文件夹&#xff0c;并将备份文件复制到共享文件夹中2.2 还原数据3 验证还原的数据库 3.1 方式一&#xff1a;核对工作项所在的表的数据3.2 方式二&#xff1a;将数据库配置到应用层&#xff0c;在应用中验证数据4. 常见问题&#xff1…

FAST协议解析1 通过输入输出逆解析

一、前言 FAST协议可以支持金融机构间高吞吐量、低延迟的数据通讯&#xff0c;目前我知道的应用领域是沪深交易所的Level-2行情传输。网络上无论是FAST协议本身&#xff0c;还是使用相关工具&#xff08;openfast、quickfast&#xff09;对FAST行情进行解析&#xff0c;相关的…

MC9S12G128开发板—解决小车九宫格方位移动功能实现遇到的一些问题

接着我的上一篇文章&#xff1a;MC9S12G128开发板—实现按键发送CAN报文指示小车移动功能。本篇文章主要记录下在实现小车九宫格方位移动功能过程中&#xff0c;遇到的一些程序问题以及解决措施。 1. 上位机小车响应开发板按键CAN报文指令的响应出错问题 问题现象描述&#x…

自动驾驶行业观察之2023上海车展-----车企发展趋势(1)

新势力发展趋势 小鹏汽车&#xff1a;发布新车G6&#xff08;中型SUV&#xff09;&#xff0c;将于2023年年中上市 发布新车G6&#xff1a;车展上&#xff0c;小鹏G6正式首发亮相&#xff0c;定位中型SUV&#xff0c;对标Tesla Model Y&#xff0c;将于2023年年中上市并开始交…

基于web的商场商城后台管理系统

该系统用户分为两类&#xff1a;普通员工和管理员。普通员工是指当前系统中的需要对商品和客户的信息进行查询的人。此类用户只能查看自己的信息&#xff0c;以及对商品和客户的信息进行查看。管理员用户可以对自己和他人的信息进行维护&#xff0c;包括对商品入库、销售、库存…

Redis缓存过期淘汰策略

文章目录 1、如何设置 Redis 最大运行内存&#xff1f;2、过期删除策略3、内存淘汰策略 1、如何设置 Redis 最大运行内存&#xff1f; 在配置文件 redis.conf 中&#xff0c;可以通过参数 maxmemory 来设定最大运行内存&#xff0c;只有在 Redis 的运行内存达到了我们设置的最…

代码命名规范

日常编码中&#xff0c;代码的命名是个大的学问。能快速的看懂开源软件的代码结构和意图&#xff0c;也是一项必备的能力。那它们有什么规律呢&#xff1f; Java项目的代码结构&#xff0c;能够体现它的设计理念。Java采用长命名的方式来规范类的命名&#xff0c;能够自己表达…

消息称苹果Type-C口充电未设MFi限制,iOS17将更新Find My服务

根据国外科技媒体 iMore 报道&#xff0c;基于消息源 analyst941 透露的信息&#xff0c;苹果公司目前并未开发 MFi 限制。 根据推文信息内容&#xff0c;两款 iPhone 15 机型的最高充电功率为 20W&#xff0c;而 iPhone 15 Pro 机型的最高支持 27W 充电。 此前古尔曼表示苹…