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.rhkb.cn/news/457827.html

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

相关文章

鸿蒙是必经之路

少了大嘴的发布会&#xff0c;老实讲有点让人昏昏入睡。关于技术本身的东西&#xff0c;放在后面。 我想想来加把油~ 鸿蒙发布后褒贬不一&#xff0c;其中很多人不太看好鸿蒙&#xff0c;一方面是开源性、一方面是南向北向的利益问题。 不说技术的领先点&#xff0c;我只扯扯…

破解API加密逆向接口分析,看这篇就够了

破解API加密逆向接口分析&#xff0c;看这篇就够了 每日一练&#xff1a;API接口数据逆向&#xff0c;看完这篇&#xff0c;就能学会找到逆向的入口函数、调试js代码、分析js代码、还原加解密算法&#xff01;为了能及时获取后续的爬虫及逆向的技术分享文章&#xff0c;请先关注…

qt EventFilter用途详解

一、概述 EventFilter是QObject类的一个事件过滤器&#xff0c;当使用installEventFilter方法为某个对象安装事件过滤器时&#xff0c;该对象的eventFilter函数就会被调用。通过重写eventFilter方法&#xff0c;开发者可以在事件处理过程中进行拦截和处理&#xff0c;实现对事…

代码随想录算法训练营第46期

class Solution { public: // 决定dp[i]的因素就是第i房间偷还是不偷。 // 偷第i房间&#xff0c;那么dp[i] dp[i - 2] nums[i] 即&#xff1a;第i-1房一定是不考虑的&#xff0c;找出 下标i-2&#xff08;包括i-2&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[…

Unity插件-Intense TPS 讲解

目录 关于TPS 打开场景&#xff1a;WeaponTest.unity&#xff0c; 只要把这些枪点&#xff0c;打开&#xff08;默认隐藏&#xff0c;不知道为何), 一开始不能运行如何修复 总结 关于TPS 个人不是TPS&#xff0c;FPS的射击游戏爱好者&#xff0c; 不过感觉这个枪感&…

riscv uboot 启动流程分析 - SPL启动流程

分析uboot 启动流程硬件&#xff1a;启明智显推出M4核心板 &#xff08;https://gitee.com/qiming-zhixian/m4-openwrt&#xff09; 1.U-boot和SPL概述 U-Boot 分为 uboot-spl 和 uboot 两个组成部分。SPL 是 Secondary Program Loader 的简称&#xff0c;第二阶段程序加载器。…

springboot083基于springboot的个人理财系统--论文pf(论文+源码)_kaic

基于springboot的个人理财系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了个人理财系统的开发全过程。通过分析个人理财系统管理的不足&#xff0c;创建了一个计算机管理个人理财系统的方案。文章介绍了个…

JavaEE初阶---多线程(三)---内存可见性/单例模式/wait,notify的使用解决线程饿死问题

文章目录 1.volatile关键字1.1保证内存的可见性--引入1.2保证内存的可见性--分析1.3保证内存的可见性--解决1.4内存可见性-JMM内存模型 2.notify和wait介绍2.1作用一&#xff1a;控制调度顺序2.2作用二&#xff1a;避免线程饿死2.3notify和notifyAll区分 3.单例模式--经典设计模…

GoogleChrome的安装和使用

Google Chrome 文章目录 Google Chrome安装主页设置扩展程序 安装 chrome官网 正规的下载好之后logo是这样的 主页设置 说明 正常情况下, GoogleChrome是无法正常访问的, 因为chrome的搜索引擎默认使用的是谷歌搜索, 而在国内是无法正常访问谷歌搜索的, 所以需要更改一下主页…

【C语言】预处理(预编译)详解(上)(C语言最终篇)

文章目录 一、预定义符号二、#define定义常量三.、#define定义宏四、带有副作用的宏参数五、宏替换的规则六、宏和函数的对比1.宏的优势2.函数的优势3.宏和函数的命名约定 一、预定义符号 学习本篇文章的内容推荐先去看前面的编译和链接&#xff0c;才能更好地理解和吸收&#…

基于springboot+vue的高校就业管理系统,

基于springbootvue的高校就业管理系统, 分为管理员&#xff1a;测试账号:10086/123 学生&#xff1a;测试账号:10087/123 包含个人信息、查看企业岗位信息、简历信息管理、我的应聘企业&#xff1a;测试账号:10070/123 包含企业信息、岗位企业信息管理、查看学生简历信息…

颠覆级AI:10秒生成超清视频

颠覆级AI&#xff1a;10秒生成超清视频 Pyramid-Flow 是一款开源 AI 视频生成神器&#x1f4bb;&#xff0c;只需文字或图片即可极速生成高清视频&#x1f3a5;&#xff01;高效、高清、资源需求低&#xff0c;适合创作广告、教学视频等多种用途&#x1f680;&#xff0c;快来…

VIVO售后真好:屏幕绿线,4年免费换屏

只要亮屏就有。这也太影响使用了。 本来想换趁机换手机&#xff0c;看了VIVO发布的X200&#xff0c;决定等明年的X200 ULTRA。手头这个就准备修。 查了一下价格&#xff0c;换屏1600&#xff0c;优惠1100。咸鱼上X70 PRO也就800。能不能简单维修就解决呢&#xff1f;于是联系…

4款免费恢复工具,一键拯救你的重要资料

不管是学习的资料、工作的文件&#xff0c;还是重要的照片和视频&#xff0c;要是丢了或者不小心删了&#xff0c;我们肯定急得像热锅上的蚂蚁。不过好在科技发达了&#xff0c;出现了一些能找回数据的神奇工具。今天&#xff0c;我就带你去看看四款免费数据恢复的工具&#xf…

【无人机设计与控制】改进人工势场法,引入模糊控制实现无人机路径规划和避障

摘要 本文提出了一种基于改进人工势场法并结合模糊控制的无人机路径规划和避障方法。传统的人工势场法在处理障碍物时易出现局部极小值问题&#xff0c;且对动态障碍物的应对能力有限。为了解决这些问题&#xff0c;我们引入了模糊控制来调整势场参数&#xff0c;从而使无人机…

Mybatis中的参数占位符:${...} 、#{...}的区别

Mybatis中的参数占位符&#xff1a;${...} 、#{...}的区别 在Mybatis中提供的参数占位符有两种&#xff1a;${…} 、#{…} #{…} 执行SQL时&#xff0c;会将#{…}替换为?&#xff0c;生成预编译SQL&#xff0c;会自动设置参数值使用时机&#xff1a;参数传递&#xff0c;都使…

Java面试题——微服务篇

1.微服务的拆分原则/怎么样才算一个有效拆分 单一职责原则&#xff1a;每个微服务应该具有单一的责任。这意味着每个服务只关注于完成一项功能&#xff0c;并且该功能应该是独立且完整的。最小化通信&#xff1a;尽量减少服务之间的通信&#xff0c;服务间通信越少&#xff0c…

C++11实践指北

C11&#xff1a;书、在线工具、库。 书 1. 《现代C语言核心特性解析》 覆盖 C11~C20 特性的讲解。 视频跟读&#xff1a;https://www.bilibili.com/video/BV1nN4y1j7fv 现代CPP随笔_0CCh - 每天5分钟了解现代C新特性 2. 《C Primer》第五版 基于 C11 的 C 入门书。 正在看…

Python实现贝叶斯优化器(Bayes_opt)优化简单循环神经网络分类模型(SimpleRNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 贝叶斯优化器 (BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。 贝叶斯…

时间序列预测(九)——门控循环单元网络(GRU)

目录 一、GRU结构 二、GRU核心思想 1、更新门&#xff08;Update Gate&#xff09;&#xff1a;决定了当前时刻隐藏状态中旧状态和新候选状态的混合比例。 2、重置门&#xff08;Reset Gate&#xff09;&#xff1a;用于控制前一时刻隐藏状态对当前候选隐藏状态的影响程度。…