SpringBoot 实现 elasticsearch 查询操作(RestHighLevelClient 的案例实战)

文章目录

  • 1. 环境准备
  • 1. 查询全部
  • 2. 根据 name 查询 match 分词查询
  • 3. 根据 name 和 品牌查询 multiMatch 分词查询
  • 4. 根据 brand 查询 match 分词查询
  • 5. 按照价格 范围查询
  • 6. 精确查询
  • 7. boolQuery
  • 8. 分页
  • 9. 高亮查询
  • 9. 公共解析


在这里插入图片描述

上一节讲述了 SpringBoot 实现 elasticsearch 索引操作,这一章节讲述 SpringBoot 实现 elasticsearch 查询操作。


1. 环境准备

案例用到的索引库结构

PUT /hotel
{"mappings": {"properties": {"id": {"type": "keyword"},"name":{"type": "text","analyzer": "ik_max_word","copy_to": "all"},"address":{"type": "keyword","index": false},"price":{"type": "integer"},"score":{"type": "integer"},"brand":{"type": "keyword","copy_to": "all"},"city":{"type": "keyword","copy_to": "all"},"starName":{"type": "keyword"},"business":{"type": "keyword"},"location":{"type": "geo_point"},"pic":{"type": "keyword","index": false},"all":{"type": "text","analyzer": "ik_max_word"}}}
}

1. 查询全部

@GetMapping("/searchAll")
public List<HotelDoc> searchAll() throws Exception {//1.创建请求语义对象SearchRequest searchRequest = new SearchRequest("索引名称");// QueryBuilders: 构建查询类型searchRequest.source().query(QueryBuilders.matchAllQuery());SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return handleResponse(searchResponse);
}

2. 根据 name 查询 match 分词查询

 @GetMapping("/searchByName/{name}")
public List<HotelDoc> searchByName(@PathVariable("name") String name) throws Exception {//1.创建请求语义对象SearchRequest searchRequest = new SearchRequest("索引名称");// QueryBuilders: 构建查询类型searchRequest.source().query(QueryBuilders.matchQuery("name", name));SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return handleResponse(searchResponse);
}

3. 根据 name 和 品牌查询 multiMatch 分词查询

@GetMapping("/searchByNameAndBrand/{name}")
public List<HotelDoc> searchByNameAndBrand(@PathVariable("name") String name) throws Exception {//1.创建请求语义对象SearchRequest searchRequest = new SearchRequest("索引名称");// QueryBuilders: 构建查询类型searchRequest.source().query(QueryBuilders.multiMatchQuery(name,"name","brand"));SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return handleResponse(searchResponse);
}

4. 根据 brand 查询 match 分词查询

@GetMapping("/searchByBrand/{name}")
public List<HotelDoc> searchByBrand(@PathVariable("name") String name) throws Exception {//1.创建请求语义对象SearchRequest searchRequest = new SearchRequest("索引名称");// QueryBuilders: 构建查询类型searchRequest.source().query(QueryBuilders.matchQuery("brand", name));SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return handleResponse(searchResponse);
}

5. 按照价格 范围查询

 @GetMapping("/searchByPrice/{low}/{high}")
public List<HotelDoc> searchByPrice(@PathVariable("low") String low, @PathVariable("high") String high) throws Exception {//1.创建请求语义对象SearchRequest searchRequest = new SearchRequest("索引名称");// QueryBuilders: 构建查询类型searchRequest.source().query(QueryBuilders.rangeQuery("price").gte(low).lte(high));SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return handleResponse(searchResponse);
}

6. 精确查询

@GetMapping("/termQueryCity/{city}")
public List<HotelDoc> termQueryCity(@PathVariable("city") String city) throws Exception {//1.创建请求语义对象SearchRequest searchRequest = new SearchRequest("索引名称");// QueryBuilders: 构建查询类型SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//searchSourceBuilder.query(QueryBuilders.termQuery("city", city)); 这行有点小问题//	https://zhuanlan.zhihu.com/p/270426807 参考searchSourceBuilder.query(QueryBuilders.termQuery("city.keyword", city));searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);return handleResponse(searchResponse);
}

7. boolQuery

@GetMapping("/testBool")
public List<HotelDoc> testBool() throws Exception {// 1.准备RequestSearchRequest request = new SearchRequest("索引名称");// 2.准备DSL// 2.1.准备BooleanQueryBoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 2.2.添加termboolQuery.must(QueryBuilders.termQuery("city.keyword", "杭州"));// 2.3.添加rangeboolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));request.source().query(boolQuery);// 3.发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);// 4.解析响应return handleResponse(response);
}

8. 分页

 @GetMapping("/testPageAndSort/{currentPage}/{pageSize}")
public List<HotelDoc> testPageAndSort(@PathVariable("currentPage") Integer currentPage, @PathVariable("pageSize") Integer pageSize) throws Exception {// 页码,每页大小// 1.准备RequestSearchRequest request = new SearchRequest("索引名称");// 2.准备DSL// 2.1.queryrequest.source().query(QueryBuilders.matchAllQuery());// 2.2.排序 sortrequest.source().sort("price", SortOrder.ASC);// 2.3.分页 from、sizerequest.source().from((currentPage - 1) * pageSize).size(pageSize);// 3.发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);// 4.解析响应return handleResponse(response);
}

9. 高亮查询

 @GetMapping("/testHighlight/{name}")
void testHighlight(@PathVariable("name") String name) throws Exception {// 1.准备RequestSearchRequest request = new SearchRequest("索引名称");// 2.准备DSL// 2.1.queryrequest.source().query(QueryBuilders.matchQuery("name", name));// 2.2.高亮request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));// 3.发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);// 4.解析响应handleResponse2(response);
}

9. 公共解析

private List<HotelDoc> handleResponse(SearchResponse response) throws Exception {// 获取命中的所有内容SearchHits searchHits = response.getHits();// 获取命中的总条数long count = searchHits.getTotalHits().value;System.out.println("命中的条数为: "+ count);// 获取命中的文档对象数组SearchHit[] hits = searchHits.getHits();List<HotelDoc> docList = new ArrayList<>();for (SearchHit hit : hits) {// 解析每一个hit对象得到对应的文档数据String json = hit.getSourceAsString();//  HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);docList.add(JSON.parseObject(json, HotelDoc.class));}//destroy();return docList;
}private void handleResponse2(SearchResponse response) {// 4.解析响应SearchHits searchHits = response.getHits();// 4.1.获取总条数long total = searchHits.getTotalHits().value;System.out.println("共搜索到" + total + "条数据");// 4.2.文档数组SearchHit[] hits = searchHits.getHits();// 4.3.遍历for (SearchHit hit : hits) {// 获取文档sourceString json = hit.getSourceAsString();// 反序列化HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);// 获取高亮结果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);}
}


在这里插入图片描述

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

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

相关文章

小程序蓝牙通信

蓝牙通信能力封装 一开始是根据uniapp提供的蓝牙api写的蓝牙方法&#xff0c;之后发现复用性&#xff0c;以及一些状态的监听存在缺陷&#xff0c;之后整理成了类。这样复用性以及状态监听的问题就解决了。 蓝牙组件 创建蓝牙组件的类 单例模式是为了保证蓝牙长连接&#xff0…

(22)LED灯(外部)

文章目录 前言 22.1 带有I2C连接的RGB LEDs/显示器 22.2 串行连接的设备 22.3 NTF LED的含义 前言 外部 LED 或 LED 显示屏可以通过连接到自动驾驶仪的 I2C 端口&#xff0c;或者在 4.0 及以后的版本中&#xff0c;如果是串行编程的设备&#xff0c;可以通过输出使用 SERV…

Image Sensor的FSIN/VSYNC

本文介绍Image Sensor的FSIN/VSYNC。 产品开发过程(比如3D成像)中&#xff0c;有时会遇到需要2个及以上的Image Sensor同步采集&#xff0c;因此&#xff0c;Image Sensor厂家对于他们的产品都提供了同步功能&#xff0c;也就是我们经常所见的FSIN/VSYNC(OV),XVS(Sony IMX3系列…

gen1-视频生成论文阅读

文章目录 摘要贡献算法3.1 LDM3.2 时空隐空间扩散3.3表征内容及结构内容表征结构表征条件机制采样 3.4优化过程 实验结果结论 论文&#xff1a; 《Structure and Content-Guided Video Synthesis with Diffusion Models》 官网&#xff1a; https://research.runwayml.com/ge…

大象机器人myCobot 280 2023版全新功能展示

引言 机械臂是一种可编程的、自动化的机械系统&#xff0c;它可以模拟人类的动作&#xff0c;完成各种任务&#xff0c;例如装配、喷涂、包装、搬运、焊接、研磨等。由于其高度灵活性和多功能性&#xff0c;机械臂在现代社会中已经得到了广泛的应用。 myCobot 280 M5Stack 202…

Spring Boot 中的 SockJS

Spring Boot 中的 SockJS 在 Spring Boot 中&#xff0c;SockJS 是一个用于实现 WebSocket 的兼容性解决方案。本文将介绍 SockJS 的原理、使用方法和示例代码。 什么是 SockJS SockJS 是一种浏览器与服务器之间的通信协议&#xff0c;它可以在浏览器和服务器之间建立一个基于…

论文阅读:Segment Anything之阅读笔记

目录 引言整体结构介绍论文问答代码仓库中&#xff0c;模型哪部分转换为了ONNX格式&#xff1f;以及如何转的&#xff1f;Mask decoder部分 Transformer decoder block?如何整合image_embedding&#xff0c;image_pe, sparse_prompt_embedding和dense_prompt_embedding的&…

将OxyPlot封装成用户控件后在WPF中的应用

1、文件架构 2、加载依赖项 Newtonsoft.Json OxyPlot.Wpf 3、NotifyBase.cs namespace Accurate.Common {public class NotifyBase : INotifyPropertyChanged{public event PropertyChangedEventHandler? PropertyChanged;public void DoNotify([CallerMemberName] string p…

XR-FRAME 开始

目录 新建一个XR组件在页面中使用这个组件添加一个物体来点颜色和灯光有点寡淡&#xff0c;加上图像让场景更丰富&#xff0c;环境数据动起来&#xff0c;加入动画还是不够&#xff0c;放个模型再来点交互组件通信&#xff0c;加上HUD虚拟 x 现实&#xff0c;追加AR能力识别人脸…

抖音seo矩阵系统源码开发部署-开源分享(二)

目录 市场背景分析 一、 抖音seo矩阵系统开发部署流程 二、 源码开发功能构思 三、 抖音seo源码开发部署注意事项 四、 部分开发代码展示 市场背景分析 账号矩阵是通过不同平台不同账号之间建立联系&#xff0c;通过将同一品牌下不同平台不同账号的粉丝流量进行账号互通&a…

网络安全 log4j漏洞复现

前言&#xff1a; log4j被爆出“史诗级”漏洞。其危害非常大&#xff0c;影响非常广。该漏洞非常容易利用&#xff0c;可以执行任意代码。这个漏洞的影响可谓是重量级的。 漏洞描述&#xff1a; 由于Apache Log4j存在递归解析功能&#xff0c;未取得身份认证的用户&#xff…

每次装完 homebrew,ohmyzsh 就会报错:Insecure completion-dependent directories detected:

参考:https://zhuanlan.zhihu.com/p/313037188 这是因为在big sur安装homebrew后&#xff0c;会在/usr/local/share/生成一个zsh文件夹&#xff0c;里面包含了 因此&#xff0c;zsh文件默认设置的权限是775&#xff0c;也就是group user有writer的权利&#xff0c;zsh认为这是…