移动端企业网站模板下载,网站制作视频教程大全,优质做网站费用,网站开发的岗位及职责#x1f9d1; 博主简介#xff1a;CSDN博客专家#xff0c;历代文学网#xff08;PC端可以访问#xff1a;https://literature.sinhy.com/#/?__c1000#xff0c;移动端可微信小程序搜索“历代文学”#xff09;总架构师#xff0c;15年工作经验#xff0c;精通Java编… 博主简介CSDN博客专家历代文学网PC端可以访问https://literature.sinhy.com/#/?__c1000移动端可微信小程序搜索“历代文学”总架构师15年工作经验精通Java编程高并发设计Springboot和微服务熟悉LinuxESXI虚拟化以及云原生Docker和K8s热衷于探索科技的边界并将理论知识转化为实际应用。保持对新技术的好奇心乐于分享所学希望通过我的实践经历和见解启发他人的创新思维。在这里我希望能与志同道合的朋友交流探讨共同进步一起在技术的世界里不断学习成长。 技术合作请加本人wx注明来自csdnforeast_sea 【Elasticsearch】高亮搜索从原理到Web呈现
一、引言
在当今的大数据时代数据的高效搜索和精准呈现变得至关重要。Elasticsearch作为一款强大的分布式搜索和分析引擎被广泛应用于各种数据搜索场景。其中高亮搜索是一个非常实用的功能它能够在搜索结果中突出显示与查询关键词匹配的部分大大提高了用户体验。
假设我们正在构建一个文档管理系统用户输入关键词进行搜索时我们希望不仅能找到相关文档还能在文档的片段中清晰地显示出关键词所在的位置。这时候Elasticsearch的高亮搜索就派上了用场。例如在一个包含大量技术文章的知识库中用户搜索“Java并发编程”高亮搜索可以在搜索到的文章摘要中将“Java”和“并发编程”这几个字以特殊的样式如加粗、变色等显示出来让用户一眼就能看到匹配的部分。
然而要实现这样一个功能并非易事它涉及到多个方面的知识和技术。我们需要了解Elasticsearch的工作原理特别是其高亮搜索的原理。同时在Java开发中我们要选择合适的Elasticsearch客户端构建正确的查询语句发送请求到服务器然后解析响应结果最终在Web客户端中完美地呈现出来。这一系列的操作就像一个精密的链条每个环节都紧密相连任何一个环节出现问题都可能导致最终结果不理想。在接下来的文章中我们将一步步深入探讨Elasticsearch Java高亮搜索的各个环节帮助读者全面掌握这一重要技术。
二、Elasticsearch高亮搜索原理
什么是高亮搜索 高亮搜索是一种在搜索结果中突出显示与查询关键词匹配部分的技术。在Elasticsearch中它通过分析查询语句中的关键词在搜索到的文档中找到这些关键词的位置然后以特定的方式如添加HTML标签来标记这些位置以便在显示结果时能够突出显示。例如当我们查询“elasticsearch性能优化”时在搜索到的文档中“elasticsearch”和“性能优化”这两个短语所在的部分会被特殊标记这样用户可以很直观地看到搜索关键词在文档中的位置。 实现原理 分析查询当我们发起一个包含高亮要求的搜索查询时Elasticsearch首先会解析查询语句。它会确定查询中的关键词、查询类型如模糊查询、精确查询等以及其他相关的查询条件。搜索文档然后Elasticsearch会根据查询条件在索引的文档中进行搜索。它会使用倒排索引等技术快速定位可能包含关键词的文档。确定高亮片段一旦找到匹配的文档Elasticsearch会分析文档的内容确定关键词在文档中的具体位置。它会根据预定义的规则如前后多少个字符作为高亮片段来选择要高亮显示的部分。标记高亮最后Elasticsearch会使用特定的标记如HTML标签来标记高亮片段。例如对于HTML呈现可能会将关键词包裹在strong标签中这样在Web页面中就会以加粗的形式显示。
三、选择Elasticsearch客户端
RestHighLevelClient 简介 在Java开发中RestHighLevelClient是与Elasticsearch交互的常用客户端。它是Elasticsearch官方推荐的高级REST客户端提供了方便的API来执行各种操作包括搜索、索引创建、文档更新等。它构建在较低级别的RestClient之上隐藏了一些底层的HTTP请求细节使得开发人员可以更专注于业务逻辑。 Maven依赖 在Maven项目中我们需要添加以下依赖
dependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-high-level-client/artifactIdversion7.17.9/version
/dependency
dependencygroupIdorg.elasticsearch/groupIdartifactIdelasticsearch/artifactIdversion7.17.9/version
/dependency
dependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-client/artifactIdversion7.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();}}
}对比其他客户端可选 除了RestHighLevelClient还有TransportClient等客户端。不过TransportClient在Elasticsearch 7.0之后已被标记为弃用并且将在未来版本中被移除。RestHighLevelClient具有更好的兼容性、易用性和性能更适合现代的Elasticsearch开发。
四、添加高亮部分到查询语句
构建基本查询 在使用RestHighLevelClient进行搜索时我们首先要构建一个基本的查询对象。例如对于一个简单的关键词查询我们可以使用MatchQueryBuilder。
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;MatchQueryBuilder matchQueryBuilder QueryBuilders.matchQuery(content, elasticsearch);这里的matchQuery方法接受两个参数第一个参数是要查询的字段名这里是content字段第二个参数是查询的关键词这里是elasticsearch。
添加高亮设置 创建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服务器
构建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添加到搜索请求中。
执行搜索请求 使用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对象它包含了搜索结果以及高亮信息等。
六、解析处理高亮搜索的响应结果
获取搜索结果 从SearchResponse中获取搜索到的文档。
import org.elasticsearch.search.SearchHit;SearchHit[] searchHits searchResponse.getHits().getHits();
for (SearchHit hit : searchHits) {String sourceAsString hit.getSourceAsString();// 这里可以对原始文档内容进行处理
}这里我们通过searchResponse.getHits().getHits()获取到搜索命中的文档数组然后可以遍历这些文档。
获取高亮结果 对于每个搜索命中的文档我们可以获取其高亮部分。
MapString, 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客户端中呈现高亮搜索结果
选择Web框架以Spring Boot为例 简介 Spring Boot是一个流行的Java Web开发框架它简化了Web应用的开发过程。我们可以使用Spring Boot来构建一个Web应用用于展示Elasticsearch的高亮搜索结果。 Maven依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdversion2.7.5/version
/dependency将解析结果传递给视图 在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搜索并解析了结果ListSearchResult searchResults new ArrayList();model.addAttribute(searchResults, searchResults);return search-results;}
}这里我们创建了一个SearchController在search方法中我们将搜索结果假设是SearchResult类型的列表添加到Model对象中然后返回视图名称search-results。
在视图中呈现高亮结果 在视图文件如Thymeleaf模板中我们可以这样呈现高亮结果。
!DOCTYPE html
html xmlns:thhttp://www.thymeleaf.org
headtitleSearch Results/title
/head
bodyul th:eachresult : ${searchResults}li th:text${result.highlightedTitle}/lip th:text${result.highlightedContent}/p/ul
/body
/html这里我们使用Thymeleaf的语法通过th:each循环遍历搜索结果列表然后使用th:text将高亮的标题和内容显示出来。
八、参考资料文献
Elasticsearch官方文档Spring Boot官方文档相关技术博客和论坛如Stack Overflow等