【Elasticsearch】高亮搜索:从原理到Web呈现

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

在这里插入图片描述


在这里插入图片描述

【Elasticsearch】高亮搜索:从原理到Web呈现

一、引言

在当今的大数据时代,数据的高效搜索和精准呈现变得至关重要。Elasticsearch作为一款强大的分布式搜索和分析引擎,被广泛应用于各种数据搜索场景。其中,高亮搜索是一个非常实用的功能,它能够在搜索结果中突出显示与查询关键词匹配的部分,大大提高了用户体验。

假设我们正在构建一个文档管理系统,用户输入关键词进行搜索时,我们希望不仅能找到相关文档,还能在文档的片段中清晰地显示出关键词所在的位置。这时候,Elasticsearch的高亮搜索就派上了用场。例如,在一个包含大量技术文章的知识库中,用户搜索“Java并发编程”,高亮搜索可以在搜索到的文章摘要中,将“Java”和“并发编程”这几个字以特殊的样式(如加粗变色等)显示出来,让用户一眼就能看到匹配的部分。

然而,要实现这样一个功能并非易事,它涉及到多个方面的知识和技术。我们需要了解Elasticsearch的工作原理,特别是其高亮搜索的原理。同时,在Java开发中,我们要选择合适的Elasticsearch客户端,构建正确的查询语句,发送请求到服务器,然后解析响应结果,最终在Web客户端中完美地呈现出来。这一系列的操作就像一个精密的链条,每个环节都紧密相连,任何一个环节出现问题都可能导致最终结果不理想。在接下来的文章中,我们将一步步深入探讨Elasticsearch Java高亮搜索的各个环节,帮助读者全面掌握这一重要技术。

二、Elasticsearch高亮搜索原理

  1. 什么是高亮搜索
    • 高亮搜索是一种在搜索结果中突出显示与查询关键词匹配部分的技术。在Elasticsearch中,它通过分析查询语句中的关键词,在搜索到的文档中找到这些关键词的位置,然后以特定的方式(如添加HTML标签)来标记这些位置,以便在显示结果时能够突出显示。
    • 例如,当我们查询“elasticsearch性能优化”时,在搜索到的文档中,“elasticsearch”和“性能优化”这两个短语所在的部分会被特殊标记,这样用户可以很直观地看到搜索关键词在文档中的位置。
  2. 实现原理
    • 分析查询:当我们发起一个包含高亮要求的搜索查询时,Elasticsearch首先会解析查询语句。它会确定查询中的关键词、查询类型(如模糊查询、精确查询等)以及其他相关的查询条件。
    • 搜索文档:然后,Elasticsearch会根据查询条件在索引的文档中进行搜索。它会使用倒排索引等技术快速定位可能包含关键词的文档。
    • 确定高亮片段:一旦找到匹配的文档,Elasticsearch会分析文档的内容,确定关键词在文档中的具体位置。它会根据预定义的规则(如前后多少个字符作为高亮片段)来选择要高亮显示的部分。
    • 标记高亮:最后,Elasticsearch会使用特定的标记(如HTML标签)来标记高亮片段。例如,对于HTML呈现,可能会将关键词包裹在<strong>标签中,这样在Web页面中就会以加粗的形式显示。

三、选择Elasticsearch客户端

  1. RestHighLevelClient
    • 简介
      • 在Java开发中,RestHighLevelClient是与Elasticsearch交互的常用客户端。它是Elasticsearch官方推荐的高级REST客户端,提供了方便的API来执行各种操作,包括搜索、索引创建、文档更新等。
      • 它构建在较低级别的RestClient之上,隐藏了一些底层的HTTP请求细节,使得开发人员可以更专注于业务逻辑。
    • Maven依赖
      • 在Maven项目中,我们需要添加以下依赖:
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.17.9</version>
</dependency>
<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.17.9</version>
</dependency>
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.17.9</version>
</dependency>
  • 初始化客户端
    • 以下是初始化RestHighLevelClient的示例代码:
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;public class ElasticsearchClientUtil {private static RestHighLevelClient client;public static RestHighLevelClient getClient() {if (client == null) {RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));client = new RestHighLevelClient(builder);}return client;}public static void closeClient() {try {if (client!= null) {client.close();}} catch (IOException e) {e.printStackTrace();}}
}
  1. 对比其他客户端(可选)
    • 除了RestHighLevelClient,还有TransportClient等客户端。不过,TransportClient在Elasticsearch 7.0之后已被标记为弃用,并且将在未来版本中被移除。RestHighLevelClient具有更好的兼容性、易用性和性能,更适合现代的Elasticsearch开发。

四、添加高亮部分到查询语句

  1. 构建基本查询
    • 在使用RestHighLevelClient进行搜索时,我们首先要构建一个基本的查询对象。例如,对于一个简单的关键词查询,我们可以使用MatchQueryBuilder
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("content", "elasticsearch");
  • 这里的matchQuery方法接受两个参数,第一个参数是要查询的字段名(这里是content字段),第二个参数是查询的关键词(这里是elasticsearch)。
  1. 添加高亮设置
    • 创建HighlightBuilder
      • 要添加高亮部分,我们需要创建一个HighlightBuilder对象。
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;HighlightBuilder highlightBuilder = new HighlightBuilder();
  • 设置高亮字段
    • 我们可以指定要高亮的字段,例如:
highlightBuilder.field("content");
  • 设置高亮标签(可选)
    • 如果我们想要自定义高亮的显示标签,比如使用<em>标签代替默认的<strong>标签,我们可以这样设置:
highlightBuilder.preTags("<em>");
highlightBuilder.postTags("</em>");
  • 将高亮设置添加到查询
    • 最后,我们将高亮设置添加到查询对象中。
matchQueryBuilder.highlighter(highlightBuilder);

五、发送高亮搜索请求到ES服务器

  1. 构建SearchRequest
    • 我们需要构建一个SearchRequest对象来封装我们的搜索请求。
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.index.Index;Index index = new Index("my_index", "_doc");
SearchRequest searchRequest = new SearchRequest(index);
searchRequest.source().query(matchQueryBuilder);
  • 这里我们指定了要搜索的索引(my_index),并且将之前构建的包含高亮设置的查询对象(matchQueryBuilder)添加到搜索请求中。
  1. 执行搜索请求
    • 使用RestHighLevelClient来执行搜索请求。
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;RestHighLevelClient client = ElasticsearchClientUtil.getClient();
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  • 这里我们调用client.search方法,传入SearchRequest对象和默认的请求选项(RequestOptions.DEFAULT),然后得到SearchResponse对象,它包含了搜索结果以及高亮信息等。

六、解析处理高亮搜索的响应结果

  1. 获取搜索结果
    • SearchResponse中获取搜索到的文档。
import org.elasticsearch.search.SearchHit;SearchHit[] searchHits = searchResponse.getHits().getHits();
for (SearchHit hit : searchHits) {String sourceAsString = hit.getSourceAsString();// 这里可以对原始文档内容进行处理
}
  • 这里我们通过searchResponse.getHits().getHits()获取到搜索命中的文档数组,然后可以遍历这些文档。
  1. 获取高亮结果
    • 对于每个搜索命中的文档,我们可以获取其高亮部分。
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
if (highlightFields!= null) {HighlightField highlightField = highlightFields.get("content");if (highlightField!= null) {Text[] fragments = highlightField.getFragments();if (fragments!= null) {for (Text fragment : fragments) {String highlightedFragment = fragment.string();// 这里可以将高亮片段替换到原始文档中的相应位置}}}
}
  • 首先我们从hit对象中获取HighlightFields的映射,然后找到我们之前设置高亮的字段(这里是content)对应的HighlightField对象。如果存在高亮字段,我们获取其片段(fragments),这些片段就是包含高亮标记的文本部分。

七、在WEB客户端中呈现高亮搜索结果

  1. 选择Web框架(以Spring Boot为例)
    • 简介
      • Spring Boot是一个流行的Java Web开发框架,它简化了Web应用的开发过程。我们可以使用Spring Boot来构建一个Web应用,用于展示Elasticsearch的高亮搜索结果。
    • Maven依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.5</version>
</dependency>
  1. 将解析结果传递给视图
    • 在Spring Boot的Controller中,我们可以将解析后的高亮搜索结果传递给视图。
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class SearchController {@GetMapping("/search")public String search(Model model) {// 假设这里已经执行了Elasticsearch搜索并解析了结果List<SearchResult> searchResults = new ArrayList<>();model.addAttribute("searchResults", searchResults);return "search-results";}
}
  • 这里我们创建了一个SearchController,在search方法中,我们将搜索结果(假设是SearchResult类型的列表)添加到Model对象中,然后返回视图名称(search-results)。
  1. 在视图中呈现高亮结果
    • 在视图文件(如Thymeleaf模板)中,我们可以这样呈现高亮结果。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>Search Results</title>
</head>
<body><ul th:each="result : ${searchResults}"><li th:text="${result.highlightedTitle}"></li><p th:text="${result.highlightedContent}"></p></ul>
</body>
</html>
  • 这里我们使用Thymeleaf的语法,通过th:each循环遍历搜索结果列表,然后使用th:text将高亮的标题和内容显示出来。

八、参考资料文献

  1. Elasticsearch官方文档
  2. Spring Boot官方文档
  3. 相关技术博客和论坛,如Stack Overflow等

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

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

相关文章

短视频矩阵源代码部署过程中可能遇到的常见问题及其概述

技术选型挑战 前端技术栈&#xff1a;不恰当的选择可能导致界面响应迟缓、用户交互体验不佳。例如&#xff0c;HTML、CSS、JavaScript等前端技术的运用不当&#xff0c;会影响页面的渲染速度和交互流畅性。 后端技术&#xff1a;后端开发语言的选择若与项目需求不匹配&#xff…

15.初始接口1.0 C#

这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】&#xff08;文心一言AI生成&#xff09; 在C#编程世界中&#xff0c;接口&#xff08;Interface&#xff09;扮演着至关重要的角色&#xff0c;它定义了一组方法&#xff0c;但不提供这些方法的实现。接口作为…

什么是正则化?Regularization: The Stabilizer of Machine Learning Models(中英双语)

正则化&#xff1a;机器学习模型的稳定器 1. 什么是正则化&#xff1f; 正则化&#xff08;Regularization&#xff09;是一种在机器学习模型训练中&#xff0c;通过约束模型复杂性以防止过拟合的技术。 它的核心目标是让模型不仅在训练集上表现良好&#xff0c;还能在测试集上…

Day9 神经网络的偏导数基础

多变量函数与神经网络 在神经网络中&#xff0c;我们经常遇到多变量函数。这些函数通常描述了网络的输入、权重、偏置与输出之间的关系。例如&#xff0c;一个简单的神经元输出可以表示为&#xff1a; z f ( w 1 x 1 w 2 x 2 … w n x n b ) z f(w_1x_1 w_2x_2 \ldots…

map和set题目练习

一、习题一&#xff1a;随机链表的复制 1.1题目详情 1.2思路 在没有学习map和set之前&#xff0c;解决这道题最大的问题就在于无法建立原链表与拷贝链表的映射关系&#xff0c;只能通过在原链表每个节点后面新建一个新的链表来进行节点间的对应&#xff0c;而学习了map之后&a…

Hw亮度省电

1. 亮度控制策略 /decompile-hw/decompile/app/HwPowerGenieEngine3/src/main/res/xml/backlight_policy.xml <?xml version"1.0" encoding"utf-8"?> 2 <backlight_policy xmlns:android"http://schemas.android.com/apk/res/android&qu…

C语言入门(一):A + B _ 基础输入输出

前言 本专栏记录C语言入门100例&#xff0c;这是第&#xff08;一&#xff09;例。 目录 一、【例题1】 1、题目描述 2、代码详解 二、【例题2】 1、题目描述 2、代码详解 三、【例题3】 1、题目描述 2、代码详解 四、【例题4】 1、题目描述 2、代码详解 一、【例…

【21天学习AI底层概念】day8 什么是类意识?

类意识&#xff08;Quasi-Consciousness&#xff09; 是一个用来描述人工智能或复杂系统表现出的类似意识的行为或特性的概念。虽然这种系统不具备真正的意识&#xff08;即主观体验、情感和自我觉知&#xff09;&#xff0c;但在外部表现上&#xff0c;它们可能表现出与有意识…

Docker 镜像源 阿里镜像源限制后其他镜像源

要在Docker中修改镜像源&#xff0c;你需要编辑或创建Docker的配置文件来指定新的镜像源地址。以下是如何为Docker配置中国镜像源的步骤&#xff1a; 找到或创建Docker的配置文件daemon.json。 在Linux系统中&#xff0c;该文件通常位于/etc/docker/目录下。 编辑daemon.jso…

渗透测试学习笔记(五)网络

一.IP地址 1. IP地址详解 ip地址是唯一标识&#xff0c;一段网络编码局域网&#xff08;内网&#xff09;&#xff1a;交换机-网线-pcx.x.x.x 32位置2进制&#xff08;0-255&#xff09; IP地址五大类 IP类型IP范围A类0.0.0.0 到 127.255.255.255B类128.0.0.0 到191.255.25…

《自制编译器》--青木峰郎 -读书笔记 编译hello

在该书刚开始编译hello.cb时就遇到了问题。 本人用的是wsl&#xff0c;环境如下&#xff0c; 由于是64位&#xff0c;因此根据书中的提示&#xff0c;从git上下载了64位的cb编译器 cbc-64bit 问题一: 通过如下命令编译时,总是报错。 cbc -Wa,"--32" -Wl,"-…

LruCache(本地cache)生产环境中遇到的问题及改进

问题&#xff1a;单机qps增加时请求摘要后端&#xff0c;耗时也会增加&#xff0c;因为超过了后端处理能力&#xff08;最大qps&#xff0c;存在任务堆积&#xff09;。 版本一 引入LruCache。为了避免数据失效&#xff0c;cache数据的时效性要小于摘要后端物料的更新时间&…

jedis使用及注意事项

Jedis Jedis 是一个 Java 客户端&#xff0c;用于与 Redis 数据库进行交互。它提供了一系列简单易用的 API&#xff0c;使得在 Java 应用程序中使用 Redis 变得非常方便。以下是 Jedis 的使用方法及一些注意事项。 Jedis的优势 Lettuce客户端及Jedis客户端比较如下&#xff1a;…

CSDN博客:如何使用Python的`datasets`库转换音频采样率

CSDN博客&#xff1a;如何使用Python的datasets库转换音频采样率 什么是采样率&#xff1f;代码用途&#xff1a;调整音频数据的采样率完整代码示例代码详解运行结果&#xff08;示例&#xff09;总结 在这篇文章中&#xff0c;我们将学习如何使用Python的datasets库对音频数据…

浏览器执行机制

主线程 任务1&#xff0c;任务2 微队列微队列任务1&#xff0c; 微队列任务2延时队列延时队列任务1&#xff0c; 延时队列任务2交互队列.... 事件循环的工作原理 主线程执行同步任务&#xff1a; 主线程首先执行所有同步任务&#xff08;即栈中的任务&#xff09;。这些任务会…

Java 基础知识——part 4

8.成员方法&#xff1a;Java中必须通过方法才能对类和对象的属性操作&#xff1b;成员方法只在类的内部声明并加以实现。一般声明成员变量后再声明方法。 9.方法定义 方法的返回值是向外界输出的信息&#xff0c;方法类型和返回值类型同&#xff1b;返回值通过return返回&…

设计模式12:抽象工厂模式

系列总链接&#xff1a;《大话设计模式》学习记录_net 大话设计-CSDN博客 参考&#xff1a; C设计模式&#xff1a;抽象工厂模式&#xff08;风格切换案例&#xff09;_c 抽象工厂-CSDN博客 1.概念 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是软件设计…

【YashanDB知识库】kettle同步大表提示java内存溢出

【问题分类】数据导入导出 【关键字】数据同步&#xff0c;kettle&#xff0c;数据迁移&#xff0c;java内存溢出 【问题描述】kettle同步大表提示ERROR&#xff1a;could not create the java virtual machine! 【问题原因分析】java内存溢出 【解决/规避方法】 ①增加JV…

适配体技术在新药发现中的应用

适配体筛选技术在新药发现中的具体应用 适配体筛选技术&#xff0c;特别是SELEX&#xff08;Systematic Evolution of Ligands by Exponential Enrichment&#xff0c;指数富集的配体系统进化技术&#xff09;&#xff0c;在新药发现中扮演着至关重要的角色。这种技术能够从庞…

C/S软件授权注册系统(Winform+WebApi+.NET8+EFCore版)

适用软件&#xff1a;C/S系统、Winform桌面应用软件。 运行平台&#xff1a;Windows .NETCore&#xff0c;.NET8 开发工具&#xff1a;Visual Studio 2022&#xff0c;C#语言 数据库&#xff1a;Microsoft SQLServer 2012&#xff0c;Oracle 21c&#xff0c;MySQL8&#xf…