详解SpringCloud微服务技术栈:ElasticSearch实践2——RestClient查询并处理文档

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习
🌌上期文章:详解SpringCloud微服务技术栈:ElasticSearch搜索结果处理(排序、分页、高亮)
📚订阅专栏:微服务技术全家桶
希望文章对你们有所帮助

这一部分主要是做点demo,用代码的方式,进行文档的查询,并且对查询的结果进行排序、分页和高亮显示。
而实现这些功能的DSL语句已经在前面几篇中实现了,这里会参考DSL语句编写测试代码。
这部分扎实了就做个实战。

ElasticSearch实践2——RestClient查询并处理文档

  • 快速入门
  • 全文检索查询
  • 精确查询(term、range查询)
  • 复合查询(bool查询)
  • 排序和分页
  • 高亮显示

快速入门

通过match_all来演示一下RestClient中关于文档查询的基本API:

	private RestHighLevelClient client;@Testvoid testMatchAll() throws IOException {//准备requestSearchRequest request = new SearchRequest("hotel");//准备DSLrequest.source().query(QueryBuilders.matchAllQuery());//发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);System.out.println("response = " + response);}

而返回的JSON对象类型是这样的:
在这里插入图片描述
显然,我们只需要逐层解析出hits里面的信息,其中total包含了查询的总条数。
解析结果的API演示如下:

	@Testvoid testMatchAll() throws IOException {//准备requestSearchRequest request = new SearchRequest("hotel");//准备DSL,source()封装了高亮、排序等非常多的功能,QueryBuilders提供了很多查询的函数request.source().query(QueryBuilders.matchAllQuery());//发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//解析响应SearchHits searchHits = response.getHits();//获取总条数long total = searchHits.getTotalHits().value;System.out.println("共搜索到" + total + "条数据");//文档数组SearchHit[] hits = searchHits.getHits();for (SearchHit hit : hits) {//获取文档sourceString json = hit.getSourceAsString();//将json反序列化为对象HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println("hotelDoc = " + hotelDoc);}System.out.println("response = " + response);}

全文检索查询

全文检索的match和multi_match查询与match_all的API基本一致。差别是查询条件,也就是query的部分。在DSL语句中的差别是match_all无需指定查询的字段,而match和multi_match都需要指定查询的字段。
上面match_all的RestClient写法中,只需要修改一下查询的条件,也就是修改query里面的QueryBuilders即可:

//单字段查询
QueryBuilders.matchQuery("all", "如家");
//多字段查询
QueryBuilders.multiMatchQuery("如家", "name", "business");

既然如此,实际上在做查询的时候,很多代码都是重复的,可以将结果的解析做一个抽取(快捷键Ctrl+Alt+M):

	private static void handleResponse(SearchResponse response) {//解析响应SearchHits searchHits = response.getHits();//获取总条数long total = searchHits.getTotalHits().value;System.out.println("共搜索到" + total + "条数据");//文档数组SearchHit[] hits = searchHits.getHits();for (SearchHit hit : hits) {//获取文档sourceString json = hit.getSourceAsString();//将json反序列化为对象HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println("hotelDoc = " + hotelDoc);}System.out.println("response = " + response);}

精确查询(term、range查询)

和上面一样,具体要修改的地方就是query里面QueryBuilders的实现:

//term查询(词条查询)
QueryBuilders.termQuery("city", "杭州");
//range查询(范围查询)
QueryBuilders.rangeQuery("price").gte(100).lte(150);

复合查询(bool查询)

复合查询经常组合的是term查询和range查询,同样利用QueryBuilders来实现:

//创建布尔查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//添加must条件
boolQuery.must(QueryBuilders.termQuery("city", "杭州"));
//添加filter条件
boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));

排序和分页

搜索结果的排序和分页是query同级的参数,对应API如下:

//查询
request.source().query(QueryBuilders.matchAllQuery());
//分页
request.source().from(0).size(5);
//价格排序
request.source().sort("price", SortOrder.ASC);

高亮显示

高亮API包括请求DSL构建和结果解析两部分。

请求的DSL构建:

	//queryrequest.source().query(QueryBuilders.matchQuery("all", "如家"));//高亮,链式编程request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));

但是这样还没有真正的显示出高亮,因此需要对结果进行解析。

但是高亮的结果处理会比较麻烦,可以看DSL语句运行的结果:
在这里插入图片描述
显然我们不能像之前一样获取"hit"里面的source了,因为高亮的结果已经放在了"highlight"下了,而"highlight"也是在"hit"下的。取出来的对象是Map类型的,需要根据key取出值,然后将这个值set回HotelDoc中,这样的话以后前端读取这里的信息的时候就会真正实现高亮了。

修改handleResponse里面的代码,实现获取高亮结果:

	private static void handleResponse(SearchResponse response) {//解析响应SearchHits searchHits = response.getHits();//获取总条数long total = searchHits.getTotalHits().value;System.out.println("共搜索到" + total + "条数据");//文档数组SearchHit[] hits = searchHits.getHits();for (SearchHit hit : hits) {//获取文档sourceString json = hit.getSourceAsString();//将json反序列化为对象HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);//通过hit获取高亮信息Map<String, HighlightField> highlightFields = hit.getHighlightFields();if(!CollectionUtils.isEmpty(highlightFields)){//根据字段名称获取高亮结果HighlightField highlightField = highlightFields.get("name");if (highlightField != null) {//获取高亮值String name = highlightField.getFragments()[0].string();//覆盖非高亮部分的结果hotelDoc.setName(name);}}System.out.println("hotelDoc = " + hotelDoc);}System.out.println("response = " + response);}

在这里插入图片描述

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

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

相关文章

VMware 虚拟机环境下的ubuntu 上安装mysql,并能远程访问数据库

需求&#xff1a;为了实现在linux上模拟服务器跑代码&#xff0c;并存储在mysql上&#xff0c;通过远程可视化mysql数据库软件查看linux上mysql数据库数据的实时动态。 1. 虚拟机和ubuntu的安装 这里我选择的是VMware workstation-v14, ubuntu-18.04.1。至于体流程网上很多&a…

VUE中一些概念的理解

Vue 中 computed、mounted 和 methods 的基本理解。 computed 计算属性 (computed)&#xff1a;主要用于根据现有的响应式数据&#xff08;即 data 中的数据或其他 computed 属性&#xff09;进行计算并返回一个新的值。计算属性是基于它们的响应式依赖进行缓存的。只有当依赖…

vite项目配置本地开发使用https访问,3分钟搞定

在开发过程中&#xff0c;有时候需要用到一些音视频接口等需要https才能拿到权限&#xff0c;为方便开发过程中调试&#xff0c;这里就介绍几种vite项目快速开启https访问的方式。vite配置项说明文档&#xff1a;开发服务器选项 | Vite 官方中文文档 第一种&#xff1a;使用插件…

api管理工具的新发现

一、之前用过的api管理工具 关于api管理工具&#xff0c;之前用过yapi和postman&#xff0c;但是后来发现了这两个工具 二、新发现的更强大的&#xff1a;Apifox和Eolink Apifox和Eolink&#xff0c;那这两个工具有什么优势呢&#xff1f; 2.1Apifox 其中 Apifox Postman …

Xlua分析:Lua调用C#

在之前的博客Lua与C#交互初析-CSDN博客中讲了有关lua和c#交互的比较浅层的概念&#xff0c;即C#侧注册[LuaCallCSharp]和[CSharpCallLua]的标签后&#xff0c;即可实现双侧沟通。但是还是没有讲明白里面的一些具体内容包括参数传递、xlua栈调用&#xff0c;甚至是C#如何调用lua…

SpringBoot引入 liteflow 规则引擎,yyds!

1前言 在日常的开发过程中&#xff0c;经常会遇到一些串行或者并行的业务流程问题&#xff0c;而业务之间不必存在相关性。 在这样的场景下&#xff0c;使用策略和模板模式的结合可以很好的解决这个问题&#xff0c;但是使用编码的方式会使得文件太多,在业务的部分环节可以这…

R语言【taxlist】——levels():获取或设置分类等级列表

Package taxlist version 0.2.4 Description 分类层次结构可以设置为 taxlist 对象中的级别&#xff0c;按从低到高的顺序排列。 在 taxlist 对象中为特定分类概念添加分类级别。此外&#xff0c;概念限制的变化可能涉及其分类层次结构的变化。 Usage levels(x)## S3 method…

五、C#与数据库交互(数据绑定与数据视图控件)

在C#中&#xff0c;与数据库进行交互是常见的任务&#xff0c;尤其是在.NET环境中。你可以使用ADO.NET&#xff0c;Entity Framework或Dapper等框架来实现与数据库的交互。以下是一个简单的例子&#xff0c;展示如何使用ADO.NET来从数据库中获取数据并绑定到Windows Forms应用程…

python基础3

7.5 range range 可以生成数字供 for 循环遍历 , 它可以传递三个参数&#xff0c;分别表示 起始、结束和步长。 8. 数据类型高级 8.1 字符串高级 字符串的常见操作包括&#xff1a; 获取长度 :len len 函数可以获取字符串的长度。 查找内容 :find 查找指定内容在字符…

Compose | UI组件(五) | Button 按钮组件

文章目录 前言Button 是什么&#xff1f;Button的创建Button显示水平方向的UI IconButton是什么&#xff1f;IconButton是创建 FloatingActionButton是什么&#xff1f;FloatingActionButton创建 ExtendedFloatingActionButton是什么&#xff1f; 总结 前言 随着移动端的技术不…

java—AWT

AWT 课程&#xff1a;1、GUI编程简介_哔哩哔哩_bilibili 一.介绍 包含了很多类和接口&#xff01;GUI&#xff01;元素&#xff1a;窗口、按钮、文本框java.awt 二.窗口 1.构造 2.方法 // 实例化frame类Frame frame new Frame("这个一个框");// 设置可见性frame.…

Metaphor(EXA) 基于大语言模型的搜索引擎

文章目录 关于 Metaphor使用示例 关于 Metaphor Metaphor是基于大语言模型的搜索引擎&#xff0c;允许用户使用完整的句子和自然语言搜索&#xff0c;还可以模拟人们在互联网上分享和谈论链接的方式进行查询内容。 Metaphor同时还能与LLMs结合使用&#xff0c;允许LLMs连接互联…

帧头不对齐的频段间载波聚合(interCA-NonAlignedFrame)

提升上下行吞吐量是3GPP演进的重要方向之一&#xff0c;其中&#xff0c;载波聚合是提升吞吐量最有效的手段之一。在3GPP R16中&#xff0c;帧头不对齐的频段间载波聚合被提出&#xff0c;可以进一步提升上行吞吐量。 帧头对齐的频段间载波聚合 帧头对其的频段间载波聚合&…

第十三届蓝桥杯省赛C/C++,JAVA,Python研究生组题 质因数个数

4658. 质因数个数 - AcWing题库 给定正整数 n&#xff0c;请问有多少个质数是 n 的约数。 输入格式 输入的第一行包含一个整数 n。 输出格式 输出一个整数&#xff0c;表示 n 的质数约数个数。 数据范围 对于 30%30% 的评测用例&#xff0c;1≤n≤10000 对于 60%60% 的评测用例…

(c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度

适用情况&#xff1a; ①题目中出现最短&#xff0c;最长 ②出现子串、子数组、子数列 给定一个字符串&#xff0c;只包含字母和数字&#xff0c;按要求找出字符串中的最长&#xff08;连续&#xff09;子串的长度&#xff0c;字符串本身是其最长的子串&#xff0c;子串要求&am…

编曲学习:和声音程 调式体系 唱名法 调式调性

34届和声音程 调式体系 唱名法 调式调性https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65af994be4b064a8cb1c3a5f?course_idcourse_2XLKtQnQx9GrQHac7OPmHD9tqbv 34届独立音乐人编曲训练营https://app8epdhy0u9502.pc.xiaoe-tech.com/p/t_pc/course_pc_detail/camp_p…

开源项目提交pr的方式

在开源项目中提交PR&#xff08;Pull Request&#xff09;是一种常见的贡献方式&#xff0c;它允许开发者向项目仓库提交代码更改并请求合并到主分支中。以下是提交PR的一般步骤&#xff1a; Fork仓库&#xff1a;首先&#xff0c;你需要Fork&#xff08;即复制&#xff09;你想…

鸿蒙开发-UI-组件

鸿蒙开发-UI-布局 鸿蒙开发-UI-布局-线性布局 鸿蒙开发-UI-布局-层叠布局 鸿蒙开发-UI-布局-弹性布局 鸿蒙开发-UI-布局-相对布局 鸿蒙开发-UI-布局-格栅布局 鸿蒙开发-UI-布局-列表 ​​​​​​鸿蒙开发-UI-布局-网格 鸿蒙开发-UI-布局-轮播 文章目录 前言 一、按钮 1.创建…

深度强化学习(王树森)笔记04

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

论文精读--BERT

不像视觉领域&#xff0c;在Bert出现之前的nlp领域还没有一个深的网络&#xff0c;使得能在大数据集上训练一个深的神经网络&#xff0c;并应用到很多nlp的任务上 Abstract We introduce a new language representation model called BERT, which stands for Bidirectional En…