RestHighLevelClient操作es查询文档

目录

利用RestHighLevelClient客户端操作es查询文档

查询match_all

dsl语句:

​编辑 java代码

小结

 match字段全文检索查询

dsl语句

java代码

 multi_match多字段全文检索查询

dsl语句

 java代码

term精确查询

dsl语句

java代码

range范围查询

dsl语句

java代码

 bool查询

dsl语句

java代码

 算分查询

dsl语句

java代码

 排序和分页

dsl语句

java代码

 高亮显示

dsl语句

​编辑 java代码


利用RestHighLevelClient客户端操作es查询文档

查询match_all

dsl语句:

 java代码

  • 第一步,创建SearchRequest对象,指定索引库名

  • 第二步,利用request.source()构建DSL,DSL中可以包含查询、分页、排序、高亮等

    • query():代表查询条件,利用QueryBuilders.matchAllQuery()构建一个match_all查询的DSL
  • 第三步,利用client.search()发送请求,得到响应

@SpringBootTest
public class TestSearch {@Autowiredprivate RestHighLevelClient restHighLevelClient;/*** 测试全文查询match_all*/@Testpublic void test01() throws IOException {//1.构建 查询对象SearchRequest request = new SearchRequest("hotel");//2.设置DSL语句request.source().query(QueryBuilders.matchAllQuery());//3.发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);//4.解析数据SearchHits hits = response.getHits();//5.1 获取当前条件命中的文档数量long value = hits.getTotalHits().value;//5.2 获取命中的文档SearchHit[] hitsHits = hits.getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {{    for (SearchHit hitsHit : hitsHits) {String jsonData = hitsHit.getSourceAsString();HotelDoc doc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(doc);}}System.out.println(docs);}
}

 

elasticsearch返回的结果是一个JSON字符串,结构包含:

  • hits:命中的结果
    • total:总条数,其中的value是具体的总条数值
    • max_score:所有结果中得分最高的文档的相关性算分
    • hits:搜索结果的文档数组,其中的每个文档都是一个json对象
      • _source:文档中的原始数据,也是json对象

因此,我们解析响应结果,就是逐层解析JSON字符串,流程如下:

  • SearchHits:通过response.getHits()获取,就是JSON中的最外层的hits,代表命中的结果
    • SearchHits.getTotalHits().value:获取总条数信息
    • SearchHits.getHits():获取SearchHit数组,也就是文档数组
      • SearchHit.getSourceAsString():获取文档结果中的_source,也就是原始的json文档数据

小结

查询的基本步骤是:

  1. 创建SearchRequest对象

  2. 准备Request.source(),也就是DSL。

    ① QueryBuilders来构建查询条件

    ② 传入Request.source() 的 query() 方法

  3. 发送请求,得到结果

  4. 解析结果(参考JSON结果,从外到内,逐层解析)

 match字段全文检索查询

dsl语句

java代码

/*** 单字段全文检索查询*/@Testpublic void test02() throws IOException {//构建 查询对象SearchRequest request = new SearchRequest("hotel");//设置DSL语句//第一个参数是参与匹配的字段名,第二个参数是搜索内容request.source().query(QueryBuilders.matchQuery("all","上海外滩"));//发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);//解析数据SearchHits hits = response.getHits();long value = hits.getTotalHits().value;//获取命中文档数SearchHit[] hitsHits = hits.getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hitsHit : hitsHits) {String jsonData = hitsHit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

 multi_match多字段全文检索查询

dsl语句

 java代码

    /*** 多字段匹配查询*/@Testpublic void test03() throws IOException {//构建 搜索请求对象SearchRequest request = new SearchRequest("hotel");//设置DSL语句request.source().query(QueryBuilders.multiMatchQuery("上海外滩","city","name","brand"));//发送请求SearchResponse response = restHighLevelClient.search(request,RequestOptions.DEFAULT);//解析结果SearchHits hits = response.getHits();//获取命中结果数long value = hits.getTotalHits().value;//获取文档对象SearchHit[] hitsHits = hits.getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hitsHit : hitsHits) {String jsonData = hitsHit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

term精确查询

dsl语句

java代码

    /*** 精确查询*/@Testpublic void test04() throws IOException {//构建 搜索对象SearchRequest request = new SearchRequest("hotel");//设置DSL语句request.source().query(QueryBuilders.termQuery("city","上海"));//发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);//解析数据SearchHit[] hits = response.getHits().getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hit : hits) {String jsonData = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

range范围查询

dsl语句

java代码

    /*** range范围查询*/@Testpublic void test05() throws IOException {//构建 查询对象SearchRequest request = new SearchRequest("hotel");//设置dsl语句request.source().query(QueryBuilders.rangeQuery("price").gte(200).lte(300));//发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);//解析数据SearchHit[] hits = response.getHits().getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hit : hits) {String jsonData = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

 bool查询

dsl语句

java代码

/*** bool符合查询*/@Testpublic void test06() throws IOException {//构建 查询对象SearchRequest request = new SearchRequest("hotel");//设置dsl语句//构建boolQuery对象BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.must(QueryBuilders.matchQuery("all","上海外滩"));boolQuery.mustNot(QueryBuilders.rangeQuery("price").gte(500));boolQuery.filter(QueryBuilders.geoDistanceQuery("location").distance("100km").point(31,121));request.source().query(boolQuery);//发送请求SearchResponse response = restHighLevelClient.search(request,RequestOptions.DEFAULT);//解析数据SearchHit[] hits = response.getHits().getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hit : hits) {String jsonData = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

 算分查询

dsl语句

java代码

/*** 算分查询*/@Testpublic void test07() throws IOException {//构建 查询对象SearchRequest request = new SearchRequest("hotel");//设置dsl语句//定义算分函数FunctionScoreQueryBuilder.FilterFunctionBuilder[] functions = new FunctionScoreQueryBuilder.FilterFunctionBuilder[] {new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("brand","如家"),ScoreFunctionBuilders.weightFactorFunction(10)  // 权重因子,乘以基础得分)};// 创建算分查询QueryBuilders.functionScoreQuery(QueryBuilders.matchQuery("all","上海"),functions).boostMode(CombineFunction.MULTIPLY);//发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);//解析数据SearchHit[] hits = response.getHits().getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hit : hits) {String jsonData = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

 排序和分页

dsl语句

java代码

    /*** 分页和排序*/@Testpublic void test08() throws IOException {//构建查询对象SearchRequest request = new SearchRequest("hotel");//设置dsl语句request.source().query(QueryBuilders.matchQuery("all","酒店"));// 添加基于地理位置的排序,假设我们根据"location"字段进行排序GeoDistanceSortBuilder geoDistanceSortBuilder = new GeoDistanceSortBuilder("location", 31, 121).order(SortOrder.ASC) // 升序排序.unit(DistanceUnit.KILOMETERS); // 单位为千米request.source().sort(geoDistanceSortBuilder);int page=1,size=5;//es索引从0开始request.source().from((page-1)*size).size(size);//发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHit[] hits = response.getHits().getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hit : hits) {String jsonData = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

 高亮显示

dsl语句

 java代码

/*** 分页和排序,高亮显示*/@Testpublic void test09() throws IOException {//构建查询对象SearchRequest request = new SearchRequest("hotel");//设置dsl语句request.source().query(QueryBuilders.matchQuery("all","酒店"));// 添加基于地理位置的排序,假设我们根据"location"字段进行排序GeoDistanceSortBuilder geoDistanceSortBuilder = new GeoDistanceSortBuilder("location", 31, 121).order(SortOrder.ASC) // 升序排序.unit(DistanceUnit.KILOMETERS); // 单位为千米request.source().sort(geoDistanceSortBuilder);int page=1,size=5;//es索引从0开始request.source().from((page-1)*size).size(size);//设置高量request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));//发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHit[] hits = response.getHits().getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hit : hits) {String jsonData = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);//获取高亮map集合Map<String, HighlightField> fieldMap = hit.getHighlightFields();if(!CollectionUtils.isEmpty(fieldMap)) {//获取高亮字段name的值HighlightField highlightField = fieldMap.get("name");//获取name数组的第一个值String hightName = highlightField.getFragments()[0].string();//用高亮的值替换原来的值hotelDoc.setName(hightName);}//获取排序的值Object[] sortValues = hit.getSortValues();System.out.println(Arrays.toString(sortValues));docs.add(hotelDoc);}}System.out.println(docs);}

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

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

相关文章

基于SpringBoot的旅店管理系统的设计与实现源码+Vue前端(酒店、民宿、功能较多)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Windows系统部署redis自启动服务【亲测可用】

文章目录 引言I redis以本地服务运行(Windows service)使用MSI安装包配置文件,配置端口和密码II redis服务以终端命令启动缺点运行redis-server并指定端口和密码III 知识扩展确认redis-server可用性Installing the Service引言 服务器是Windows系统,所以使用Windows不是re…

文献阅读:通过深度神经网络联合建模多个切片构建3D整体生物体空间图谱

文献介绍 文献题目&#xff1a; 通过深度神经网络联合建模多个切片构建3D整体生物体空间图谱 研究团队&#xff1a; 杨灿&#xff08;香港科技大学&#xff09;、吴若昊&#xff08;香港科技大学&#xff09; 发表时间&#xff1a; 2023-10-19 发表期刊&#xff1a; Nature M…

每日OJ题_牛客_[NOIP2001]装箱问题_01背包_C++_Java

目录 牛客_[NOIP2001]装箱问题_01背包 题目解析 C代码 Java代码 牛客_[NOIP2001]装箱问题_01背包 [NOIP2001]装箱问题 (nowcoder.com) 描述&#xff1a; 有一个箱子容量为V&#xff08;正整数&#xff0c;0 ≤ V ≤ 20000&#xff09;&#xff0c;同时有n个物品&…

Electron入门笔记

Electron入门笔记 ElectronElectron 是什么Electron流程模型创建第一个Electron项目配置自动重启主进程和渲染进程通信打包应用 Electron Electron 是什么 跨平台的桌面应用开发框架使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium和 Node.js Electro…

Print Settings Page 打印设置页面

“打印设置”页面提供了设计时工具&#xff0c;用于自定义控制视图打印版本外观的打印选项。此页面如下图所示。 “选项”和“行为”选项卡式页面提供对视图打印选项的设计时访问&#xff0c;这些选项可通过其 GridView.OptionsPrint 属性或卡片视图的 CardView.OptionsPrint 进…

基于vue框架的的点餐系统1o2te(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,商家,菜品分类,菜品信息 开题报告内容 基于Vue框架的点餐系统开题报告 一、研究背景与意义 随着移动互联网技术的飞速发展&#xff0c;餐饮行业也迎来了数字化转型的浪潮。传统的点餐方式&#xff0c;如纸质菜单和人工记录&…

颐驰06持续交付,明日科技赋能出行生活

在全球智能出行领域&#xff0c;自动驾驶技术的发展一直是行业关注的焦点。不久前&#xff0c;特斯拉发布的自动驾驶出租车引发了全球关注&#xff0c;但由于缺乏具体的技术细节&#xff0c;导致投资者信心受挫&#xff0c;特斯拉股票一度下跌近10%。与此同时&#xff0c;中国车…

CTF(四)

导言&#xff1a; 本文主要讲述在CTF竞赛中&#xff0c;web类题目file_include。 靶场链接&#xff1a;攻防世界 (xctf.org.cn) 一&#xff0c;观察页面。 可以看到一段php代码。从则段代码中我们可以知道&#xff1a; 1&#xff0c;使用include引入check.php文件&#xff…

Nodejs使用http模块创建Web服务器接收解析RFID读卡器刷卡数据

本示例使用设备&#xff1a; https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1buHvw58&ftt&id22173428704 Javascript源码 //引用http模块创建web服务器&#xff0c;监听指定的端口获取以GET、POST、JSON等方式上传的数据&#xff0c;并回应驱动读卡…

【论文学习与撰写】论文里的Mathtype公式复制粘贴,跨文档复制后错码/错位问题的解决

1、描述 问题&#xff1a;论文的草稿已经写好&#xff0c;里面的公式之类的都已经一个个打上去了 但是把草稿里的正文和公式粘贴在另一个文档里的时候&#xff0c;会出些公式格式错误的情况 那该怎么操作保证复制后的公式保持原格式呢 选中复制的内容&#xff0c;在另一个文…

探索YOLO v11:3D人工智能的RGB-D视觉革命

哈喽&#xff0c;各位OAK中国的朋友们! 大家好我是张伯生 今天&#xff0c;我想给大家演示一下最新发布的Yolo V11神经网络 下面我将演示的一个程序是&#xff1a;同时在我们的OAK相机上跑Yolo V11和RGB-D&#xff0c;也就是彩色相机和深度图的一个叠加的一个效果 RGB-D和Yo…

芯知识 | NVH-FLASH语音芯片支持平台做语音—打造音频IC技术革新

随着科技的飞速发展&#xff0c;人们对于电子产品的音频性能要求越来越高。在这种背景下&#xff0c;NVH-FLASH系列语音芯片应运而生&#xff0c;作为音频IC领域的一次重大技术革新&#xff0c;NVH-FLASH系列语音芯片凭借其卓越的性能与灵活的支持平台&#xff0c;正逐步引领着…

SpringBoot教程(三十二) | SpringBoot集成Skywalking链路跟踪

SpringBoot教程&#xff08;三十二&#xff09; | SpringBoot集成Skywalking链路跟踪 一、Skywalking是什么&#xff1f;二、Skywalking与JDK版本的对应关系三、Skywalking下载四、Skywalking 数据存储五、Skywalking 的启动六、部署探针前提&#xff1a; Agents 8.9.0 放入 项…

新手小白,如何研究货币相关性

研究货币对之间的相关性可以帮助交易者理解市场动态&#xff0c;从而优化交易策略。以下是一个详细的研究方向&#xff0c;包括每个步骤的代码&#xff0c;以及一些深入探索的建议。 研究方向 选择货币对&#xff1a;确定需要研究的两个货币对。 数据收集&#xff1a;获取选…

掌握免费API:高效获取与智能调用技巧

在数字化时代&#xff0c;免费 API 的应用越来越广泛。它们为开发者提供了丰富的资源和工具&#xff0c;帮助实现多种功能和服务。从数据获取到功能扩展&#xff0c;免费 API 极大地推动了创新和效率的提升。 本文将深入探讨“免费 API 深度求索之路”&#xff0c;涵盖从获取 …

ONLYOFFICE文档8.2:开启无缝PDF协作

ONLYOFFICE 开源办公套件的最新版本新增约30个新功能&#xff0c;并修复了超过500处故障。 什么是 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器&#xff0c;支持编辑处理文档、表格、幻灯片、可填写的表单和PDF。可多人在线协作&#xff0c;支持插件和 AI 集…

HTTP vs WebSocket

本文将对比介绍HTTP 和 WebSocket &#xff01; 相关文章&#xff1a; 1.HTTP 详解 2.WebSocket 详解 一、HTTP&#xff1a;请求/响应的主流协议 HTTP&#xff08;超文本传输协议&#xff09;是用于发送和接收网页数据的标准协议。它最早于1991年由Tim Berners-Lee提出来&…

建模与辨识【1-3章】

&#xff08;第一章&#xff09;&#xff1a; 建立数学模型的方法&#xff1a; 系统模型的分类&#xff1a;按照不同标准分类有所不同&#xff1a; 误差准则&#xff1a; &#xff08;第二章&#xff09;&#xff1a; 最优输入信号的判断标准: Fisher信息矩阵逆 M序列必考&am…

Redis 性能优化选择:Pika 的配置与使用详解

引言 在我们日常开发中 redis是我们开发业务场景中不可缺少的部分。Redis 凭借其内存存储和快速响应的特点&#xff0c;广泛应用于缓存、消息队列等各种业务场景。然而&#xff0c;随着数据量的不断增长&#xff0c;单节点的 Redis 因为内存限制和并发能力的局限&#xff0c;逐…