如何通过Elasticsearch实现搜索的关键词达到高亮的效果

高亮

首先介绍一下什么是搜索的关键词达到高亮的效果,如图所示
在这里插入图片描述
当在百度里面搜索elasticsearch的时候,可以看到出现的搜索结果里面elasticsearch这个关键词明显与其他的条文不一样,用红颜色凸显了“高亮效果”。当我们想要在自己的项目里面也实现相同的高亮效果,可以借助ES来帮助我们实现。

通过ES实现高亮效果

现在有一个场景:输入相关的面试题题目返回的结果中题目出现高亮效果,类似这样的效果
在这里插入图片描述
那么后端的逻辑应该怎么写呢?(只说明核心逻辑)

首先在查询ES的时候就设置好相应的高亮属性

    private EsSearchRequest createSearchListQuery(SubjectInfoES req){EsSearchRequest esSearchRequest = new EsSearchRequest();BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();//构造查询条件-根据题目名字查询MatchQueryBuilder matchNameQueryBuilder =QueryBuilders.matchQuery(EsSubjectFields.SUBJECT_NAME,req.getSubjectName());boolQueryBuilder.should(matchNameQueryBuilder);//设置高亮matchNameQueryBuilder.boost(2);//其他的代码逻辑...//设置高亮HighlightBuilder highlightBuilder = new HighlightBuilder().field("+").requireFieldMatch(false);highlightBuilder.preTags("<span style = \"color:red\">");highlightBuilder.postTags("</span>");//设置高亮和条件esSearchRequest.setHighlightBuilder(highlightBuilder);esSearchRequest.setBoolQueryBuilder(boolQueryBuilder);//其他的代码逻辑...return esSearchRequest;}

这里通过
HighlightBuilder highlightBuilder = new HighlightBuilder().field("+").requireFieldMatch(false);
构造了一个ES的高亮器
在这里,field("+") 表示要对所有字段进行高亮处理
requireFieldMatch(false) 表示不需要确切字段匹配,即如果任何字段中包含查询的关键字,都会被高亮显示
如果设置为requireFieldMatch(true)的话 即查询出来的字段中要完全包含查询的关键字才会被高亮处理

        highlightBuilder.preTags("<span style = \"color:red\">");highlightBuilder.postTags("</span>");

这两段代码的意思是要实现高亮的字段在返回给前端的时候会被"<span style = \"color:red\">""</span>"囊括起来,举个例子:<span style = \"color:red\"> elasticsearch倒排索引为什么快 </span>

        //设置高亮和条件esSearchRequest.setHighlightBuilder(highlightBuilder);esSearchRequest.setBoolQueryBuilder(boolQueryBuilder);

这两段代码的作用是设置搜索关键词实现高亮和实现高亮的关键词是哪些关键词

在设置好高亮的相关条件以后,就得从ES中查询相关的数据了并且处理相关的数据

    public PageResult<SubjectInfoES> querySubjectList(SubjectInfoES req) {PageResult<SubjectInfoES> pageResult = new PageResult<>();//设置相关条件EsSearchRequest esSearchRequest = createSearchListQuery(req);//搜索SearchResponse searchResponse = EsRestClient.searchWithTermQuery(getEsIndexInfo(),esSearchRequest);//获取Elasticsearch搜索响应中包含的搜索结果SearchHits searchHits = searchResponse.getHits();SearchHit[] hits = searchHits.getHits();//遍历响应结果for (SearchHit hit : hits) {//将ES返回的结果映射到返回的实体中的代码....//开始处理高亮//高亮的字段Map<String, HighlightField> highlightFields = hit.getHighlightFields();//处理name的高亮字段HighlightField nameHighlightField = highlightFields.get(EsSubjectFields.SUBJECT_NAME);if (ObjectUtils.isNotEmpty(nameHighlightField)){Text[] fragments = nameHighlightField.fragments();StringBuilder stringBuilder = new StringBuilder();for (Text fragment : fragments){stringBuilder.append(fragment.string());}result.setSubjectName(stringBuilder.toString());}//处理内容中的高亮字段HighlightField answerHighlightField = highlightFields.get(EsSubjectFields.SUBJECT_ANSWER);if (ObjectUtils.isNotEmpty(answerHighlightField)){Text[] fragments = answerHighlightField.fragments();StringBuilder stringBuilder = new StringBuilder();for (Text fragment : fragments){stringBuilder.append(fragment.string());}result.setSubjectAnswer(stringBuilder.toString());}//将ES返回的结果映射到返回的实体中的代码....}//其他的代码逻辑return pageResult;}

这段代码展现了如何处理高亮,核心代码实际上是这一段

        //高亮的字段Map<String, HighlightField> highlightFields = hit.getHighlightFields();//处理name的高亮字段HighlightField nameHighlightField = highlightFields.get(EsSubjectFields.SUBJECT_NAME);if (ObjectUtils.isNotEmpty(nameHighlightField)){Text[] fragments = nameHighlightField.fragments();StringBuilder stringBuilder = new StringBuilder();for (Text fragment : fragments){stringBuilder.append(fragment.string());}result.setSubjectName(stringBuilder.toString());}

首先调用hit.getHighlightFields()方法返回一个包含文档中高亮字段的映射,然后从高亮字段映射中获取名为 “SUBJECT_NAME” 的高亮字段(也就是题目名字),从高亮字段中提取相关的文本片段,fragments() 方法返回一个 Text 对象数组,每个 Text 对象表示高亮字段中的一个文本片段。

这里解释一下:

现在假设用户搜索了关键词 “Elasticsearch”,而搜索结果中包含了一篇文章的标题和摘要,其中标题和摘要分别是两个字段。搜索结果如下:

标题:Introduction to Elasticsearch

如果我们对标题和摘要字段都进行了高亮处理,那么可能会得到以下的高亮结果:

高亮标题:Introduction to <span style="background-color: yellow;"> Elastic </span>search

这个时候fragment(段落)的内容是Introduction to <span style="background-color: yellow;"> Elastic </span>search

最后将每个高亮的文本拼接成一个完整的字符串并存储在结果对象的相应属性中,交给前端进行相应的处理,前端可以使用 HTML 和 CSS 来展示高亮文本,通常会将匹配的关键词用特殊样式标记(例如使用 标签添加背景颜色),以使用户能够直观地看到匹配的部分,最后实现高亮效果。

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

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

相关文章

1、初识drf

drf的学习需要学习者有django基本使用知识。 文章目录 什么是drf&#xff0c;有什么作用CBV是什么初步使用drf 下载以及django创建项目django最小启动内容修改setting修改 url 编写drf视图编辑url测试返回结果 什么是drf&#xff0c;有什么作用 drf(django rest-framework),让…

C#面:有几种连接到数据库的方式,请列举出来并分别说明它们可以连接哪些数据库

ADO.NET 连接&#xff1a; ADO.NET 是 .NET Framework 提供的一种数据访问技术&#xff0c;可以连接多种类型的数据库&#xff0c;包括但不限于SQL Server、Oracle、MySQL 等。通过 ADO.NET 连接&#xff0c;可以使用各种提供程序&#xff08;如SqlClient、OracleClient、OleD…

探索Vue脚手架:构建现代化Web应用的利器

随着现代Web应用程序的不断发展&#xff0c;前端开发者们需要更高效、更灵活的工具来构建复杂的用户界面。在这个领域中&#xff0c;Vue.js作为一种流行的JavaScript框架&#xff0c;为开发者提供了丰富的生态系统和强大的工具。而Vue脚手架&#xff0c;作为Vue.js开发过程中的…

手机有线投屏到直播姬pc端教程

1 打开哔哩哔哩直播姬客户端并登录(按下图进行操作) 2 手机用usb数据线连接电脑(若跳出安装驱动的弹窗点击确定或允许),usb的连接方式为仅充电(手机差异要求为仅充电),不同品牌手机要求可能不一样,根据实际的来 3 在投屏过程中不要更改usb的连接方式(不然电脑会死机需要重启) …

MultiPath HTTP:北大与华为合作部署FLEETY

当前的终端基本都能支持蜂窝网络和wifi网络&#xff0c;然而&#xff0c;不同的网络通路都不可避免的会出现信号不好或者其他因素引起的通路性能(吞吐量、时延等)下降。为了能够提升终端业务体验&#xff0c;很多不同的MultiPath方案被提出&#xff0c;其中&#xff0c;包括应用…

使用Detours进行HOOK

文章目录 Detours介绍Detours配置Detours进行Sleep Hook Detours介绍 Detours是微软研究院开发的一款软件工具&#xff0c;用于Windows平台上的应用程序重定向和修改。 它可以在运行时修改应用程序的执行路径&#xff0c;允许开发人员注入自定义代码来改变应用程序的 行为&…

vulhub中Apache Solr 远程命令执行漏洞复现(CVE-2017-12629)

Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。此次7.1.0之前版本总共爆出两个漏洞&#xff1a;[XM…

勒索病毒钱包地址与邮箱地址集合

勒索病毒攻击已经成为了全球最大的安全威胁之一&#xff0c;99%以上的勒索病毒交付赎金都是使用BTC&#xff0c;BTC已经涨到一万多美元了&#xff0c;最近一年针对企业的勒索病毒攻击也越来越多&#xff0c;勒索病毒黑产团队在加密受害者文件之后一般会留下一些联系方式&#x…

[Flutter]打包IPA

1.直接使用Xcode运行iOS工程 不用flutter构建&#xff0c;在Xcode中是可以独立进行构建运行和打包发布的。 1).运行项目 先将flutter的build清理 $ flutter clean $ flutter pub get 然后立即用XCode打开iOS工程运行 运行会报错&#xff1a; error: The sandbox is not …

分块大小

两个指针 复杂度 \(O(u*n\frac{n^2}{u})\) 根据均值不等式&#xff0c; \(u*n\frac{n^2}{u}\) 在 \(u*n\frac{n^2}{u}\) 时取最小值 即 \(u\sqrt{n}\) 三个指针&#xff08;带修&#xff09; 复杂度 \(O(u*n\frac{n^2}{u}\frac{n^3}{u^2})\) 显然&#xff0c; \(\frac{n^2}…

C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测效果一览基本介绍模型描述程序…

Vue.js基础指令

&#xff08;在讲指令之前&#xff0c;可以先了解插值表达式&#xff0c;如果已经知道&#xff0c;当我没说&#xff09; 一.插值表达式 1.数据绑定最常见的形式就是双大括号的文本插值&#xff0c;Mustache上属性的值替代。只要绑定的数据对象上属性发生了改变&#xff0c;插…

设置asp.net core WebApi函数请求参数可空的两种方式

以下面定义的asp.net core WebApi函数为例&#xff0c;客户端发送申请时&#xff0c;默认三个参数均为必填项&#xff0c;不填会报错&#xff0c;如下图所示&#xff1a; [HttpGet] public string GetSpecifyValue(string param1,string param2,string param3) {return $"…

Node.js中的导入导出

Node.js中的导入导出 一.CommonJs标准二.ECMAScript标准1.默认导入导出2.命名导出和导入 一.CommonJs标准 导出语法&#xff1a; module.exports {对外属性名: 模块内私有变量 }导入语法&#xff1a; const 变量名 require(模块名或路径) // Node.js 环境内置模块直接写模…

【PSINS工具箱】EKF与UKF滤波

描述 对工具箱SINS/GPS&#xff0c;153例程的修改&#xff0c;将EKF和UKF放在一个文件里面&#xff0c;一次运行可以得到两个滤波的结果。 片段 运行截图 程序完整源代码 在有工具箱的情况下&#xff0c;直接运行此代码&#xff0c;即可得到结果 % 基于PSINS工具箱的IMU数据…

腾讯云轻量2核2G3M云服务器优惠价格61元一年,限制200GB月流量

腾讯云轻量2核2G3M云服务器优惠价格61元一年&#xff0c;配置为轻量2核2G、3M带宽、200GB月流量、40GB SSD盘&#xff0c;腾讯云优惠活动 yunfuwuqiba.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云轻量2核2G云服务器优惠价格 腾讯云&#xff1a;轻量应用服务器100%CPU性能…

pyqt 创建右键菜单栏

class MainModule(QMainWindow, Ui_MainWindow):def __init__(self):super().__init__(parentNone)self.setupUi(self)# 允许出现菜单栏self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu)# 对空间添加右键菜单栏处理 self.tableWidget.customContextMenuRequested.…

Java设计模式详解:单例模式

设计模式详解&#xff1a;单例模式 文章目录 设计模式详解&#xff1a;单例模式一、单例模式的原理二、单例模式的实现推荐1、饿汉模式2、静态内部类 三、单例模式的案例四、单例模式的使用场景推荐总结 一、单例模式的原理 单例模式听起来很高大上&#xff0c;但其实它的核心…

速盾:cdn可以加速接口吗?

随着互联网应用的不断发展&#xff0c;网站的访问速度成为了用户体验的重要指标之一。为了解决网站访问速度过慢的问题&#xff0c;CDN&#xff08;内容分发网络&#xff09;技术被广泛应用。CDN作为一种分布式的网络架构&#xff0c;可以将静态资源如图片、视频、JS、CSS等内容…

Mac 版 IDEA 中配置 GitLab

一、安装Git 在mac终端输入Git检测指令&#xff0c;可以通过git命令查看Git是否安装过&#xff0c;如果没有则会弹出安装按钮&#xff0c;如果安装过则会输出如下信息。 WMBdeMacBook-Pro:~ WENBO$ git usage: git [--version] [--help] [-C <path>] [-c namevalue][--…