ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮)

目录

一、基于 JavaRestClient 查询文档

1.1、查询 API 演示

1.1.1、查询基本框架

DSL 请求的对应格式

响应的解析

1.1.2、全文检索查询

1.1.3、精确查询

1.1.4、复合查询

1.1.5、排序和分页

1.1.6、高亮


一、基于 JavaRestClient 查询文档


1.1、查询 API 演示

1.1.1、查询基本框架

接下里通过一个 match_all 查询所有,来演示以下基本的 API.

    @Testpublic void testMatchAll() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.matchAllQuery());//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}/*** 处理响应* @param response*/private void handlerResponse(SearchResponse response) {//1.解析结果SearchHits hits = response.getHits();//获取总条数long total = hits.getTotalHits().value;SearchHit[] hits1 = hits.getHits();for(SearchHit searchHit : hits1) {//获取sourceString json = searchHit.getSourceAsString();System.out.println(json);}}

由上可以看出查询的基本步骤如下:

  1. 创建 SeaechRequest 对象,指定索引库.
  2. Request.source() 准备参数,也就是 DSL.
    1. 通过 QueryBuilders 构建查询条件.
    2. 传入 Request.source() 的 query() 方法,构建好完整的查询.
  3. 发送请求,得到结果.
  4. 解析结果(又外而内,逐层解析).

DSL 请求的对应格式

DSL 语句的构建是通过 HighLevelRestClient 中的 Resource 实现的,其中包含了 查询、排序】分页、高亮等所有功能.

其中  query 表示查询的意思,他的查询条件的是由 QueryBuilders 的工具类提供的,包含了各种查询方法.

响应的解析

响应解析这里,可以在 Kibana 上通过查询结果,对比着看出 API 的调用关系.

1.1.2、全文检索查询

全文检索的 match 和 multi_match 查询和前面演示的 match_all 调用的 API 基本一致,差别就是查询条件,也就是 query 部分(通过 QueryBuilders 构建的条件不一样).

    @Testpublic void testMatch() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.matchQuery("brand", "如家"));//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}

multi_match 也是如此,只是可以支持多个参数查询.

    @Testpublic void testMultiMatch() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.multiMatchQuery("如家", "brand", "name"));//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}

运行结果:

1.1.3、精确查询

精确查询常见的有 term 查询 和 range 查询,同样利用 QueryBuilders 实现.

    @Testpublic void testTerm() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.termQuery("city", "上海"));//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}

range 查询也是如此.

    @Testpublic void testRange() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.rangeQuery("price").gte(100).lte(200)); //链式调用//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}

1.1.4、复合查询

布尔查询是一个或多个查询子句的组合. 子查询的组合方式有:

  • must:必须匹配的查询条件,类似 “与”.
  • should:选择性匹配的查询条件,类似 “或”.
  • must_not:必须不匹配,不参与算分,类似 “非”.
  • filter:必须匹配,不参与算分

RestAPI 中也提供 BoolQueryBuilder 条件构建方法,用来添加上述条件.

    @Testpublic void testBoolQuery() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数BoolQueryBuilder booleanQuery = QueryBuilders.boolQuery();booleanQuery.must(QueryBuilders.termQuery("city", "上海"));booleanQuery.filter(QueryBuilders.rangeQuery("price").lte("200"));request.source().query(booleanQuery); //链式调用//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}

1.1.5、排序和分页

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

    @Testpublic void testFromSize() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.matchAllQuery());//分页 offset=20 size=10request.source().from(20).size(10);//降序排序request.source().sort("price", SortOrder.DESC);//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}

1.1.6、高亮

高亮的  API 包括请求构建 DSL 语句 和 结果解析 两个部分.

请求构建如下:

    @Testpublic void testHighLighter() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().query(QueryBuilders.matchQuery("brand", "如家"));request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));//3.发送请求,并接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应handlerResponse(response);}

响应解析如下 :

    private void handlerResponse(SearchResponse response) throws JsonProcessingException {//1.解析结果SearchHits hits = response.getHits();//获取总条数long total = hits.getTotalHits().value;SearchHit[] hits1 = hits.getHits();for(SearchHit searchHit : hits1) {//获取sourceString json = searchHit.getSourceAsString();System.out.println(json);//2.处理高亮//获取高亮Map<String, HighlightField> highlightFieldMap = searchHit.getHighlightFields();if(!CollectionUtils.isEmpty(highlightFieldMap)) {//获取高亮字段的 valueHighlightField highlightField = highlightFieldMap.get("name");if(highlightField != null) {//取出高亮结果数组中的第一个,这里是酒店名称String name = highlightField.getFragments()[0].string();//对高亮字段的处理(这里打印做演示)System.out.println(name);}}}}

运行后可以看到通过 sout 打印出的“高亮”字段(最后会传输给前端 ,让前端处理高亮. 后端只是标记出了哪些字段需要高亮处理)

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

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

相关文章

朴素迪氏最短单源路径的原理及C++实现

Dijkstra算法&#xff0c;翻译为迪杰斯特拉或狄克斯特拉。在下驽钝&#xff0c;记不住如此长的翻译&#xff0c;故简称迪氏。 时间复杂度 O(n2)&#xff0c;端点数的平方。 使用前提 边的权为正。可以非连通&#xff0c;非连通的距离为-1。 原理 源点到源点的最短路径只有…

CDH6.3.2 的pyspark读取excel表格数据写入hive中的问题汇总

需求&#xff1a;内网通过Excel文件将数据同步到外网的CDH服务器中&#xff0c;将CDH中的文件数据写入hive中。 CDH版本为&#xff1a;6.3.2 spark版本为&#xff1a;2.4 python版本&#xff1a;2.7.5 操作系统&#xff1a;CentOS Linux 7 集群方式&#xff1a;yarn-cluster …

​中秋团圆季《乡村振兴战略下传统村落文化旅游设计》许少辉八月新著

​中秋团圆季《乡村振兴战略下传统村落文化旅游设计》许少辉八月新著 ​中秋团圆季《乡村振兴战略下传统村落文化旅游设计》许少辉八月新著

机器人中的数值优化|【五】BFGS算法非凸/非光滑处理

机器人中的数值优化|【五】BFGS算法的非凸/非光滑处理 往期内容回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法&#xff0c;可行牛顿法的python实现&#xff0c;以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化&#xff0…

【web前端特效源码】使用HTML5+CSS3制作一个会动的loading加载动画效果~~适合初学者~超简单~ |前端开发|IT软件

b站视频演示效果: 【web前端特效源码】使用HTML5+CSS3制作一个会动的loading加载动画效果~~适合初学者~超简单~ |前端开发|IT软件 效果图: 完整代码: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><titl…

贪心算法-

代码随想录 什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 这么说有点抽象&#xff0c;来举一个例子&#xff1a; 例如&#xff0c;有一堆钞票&#xff0c;你可以拿走十张&#xff0c;如果想达到最大的金额&#xff0c;你要怎么拿&#xff…

Win10自带输入法怎么删除-Win10卸载微软输入法的方法

Win10自带输入法怎么删除&#xff1f;Win10系统自带输入法就是微软输入法&#xff0c;这个输入法满足了很多用户的输入需求。但是&#xff0c;有些用户想要使用其它的输入法&#xff0c;这时候就想删除掉微软输入法。下面小编给大家介绍最简单方便的卸载方法吧。 Win10卸载微软…

赋能工业数字化转型|辽宁七彩赛通受邀出席辽宁省工业互联网+安全可控先进制造业数字服务产业峰会

2023年9月25日下午&#xff0c;由软通动力信息技术&#xff08;集团&#xff09;股份有限公司主办的“工业互联网安全可控先进制造业数字服务产业峰会”在辽宁沈阳顺利举办。省市区各级政府、科研院所领导、技术专家、企业高管以及生态合作伙伴代表等齐聚一堂&#xff0c;共同探…

Lua学习笔记:debug.sethook函数

前言 本篇在讲什么 使用Lua的debug.setHook函数 本篇需要什么 对Lua语法有简单认知 依赖Sublime Text工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449; ♠ 一级标题 &…

react的动画

问: import Fade from react-reveal/Fade; 回答: import Fade from react-reveal/Fade; 是一个用于 React.js 的库&#xff08;library&#xff09;的引入语句。它可以实现在组件渲染时产生淡入效果。 要使用该库&#xff0c;首先需要确保你已经安装了 react-reveal 这个库。可…

paramiko 3

import paramiko import concurrent.futuresdef execute_remote_command(hostname, username, password, command):try:# 创建SSH客户端client paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 使用密码认证连接远程主机client.connect(h…

【Element-UI】Mock.js,案例首页导航、左侧菜单

一.Mock.js 1、什么是Mock.js Mock.js是一个用于生成模拟数据的JavaScript库。它能够模拟后端API接口&#xff0c;用于前端开发时进行接口调试和测试提高自动化测试效率。使用Mock.js可以快速创建虚拟的数据&#xff0c;并且可以设置数据的类型、格式和规则&#xff0c;从而模…

Backblaze发布2023中期SSD故障数据质量报告

作为一家在2021年在美国纳斯达克上市的云端备份公司&#xff0c;Backblaze一直保持着对外定期发布HDD和SSD的故障率稳定性质量报告&#xff0c;给大家提供了一份真实应用场景下的稳定性分析参考数据。 本文我们主要看下Backblaze最新发布的2023中期SSD相关故障稳定性数据报告。…

AWS-Lambda之导入自定义包-pip包

参考文档&#xff1a; https://repost.aws/zh-Hans/knowledge-center/lambda-import-module-error-python https://blog.csdn.net/fxtxz2/article/details/112035627 简单来说,以 " alibabacloud_dyvmsapi20170525 " 包为例 ## 创建临时目录 mkdir /tmp cd ./tmp …

在Vue中通过ElementUI构建前端页面【登录,注册】,在IEDA构建后端实现前后端分离

一.ElementUI组件入门 1.对于ElementUI的理解 是一套基于 Vue.js 的开源UI组件库&#xff0c;提供了丰富的可复用组件&#xff0c;可以帮助开发者快速构建美观、易用的前端界面 2.Element UI 的特点和优势 多样化的组件&#xff1a;Element UI 提供了众多常用的基础组件&#…

NLP 04(GRU)

一、GRU GRU (Gated Recurrent Unit)也称门控循环单元结构,它也是传统RNN的变体,同LSTM一样能够有效捕捉长序列之间的语义关联&#xff0c; 缓解梯度消失或爆炸现象&#xff0c;同时它的结构和计算要比LSTM更简单,它的核心结构可以分为两个部分去解析: 更新门、重置门 GRU的内…

两横一纵 | 寅家科技发布10年新征程战略

2023年9月22日&#xff0c;寅家科技“寅路向前”10年新征程战略发布会在上海举办&#xff0c;来自投资领域的东方富海、深创投、高新投等知名投资机构&#xff0c;一汽大众、一汽红旗、奇瑞汽车等主机厂&#xff0c;国家新能源汽车技术创新中心、梅克朗、芯驰科技、思特威等合作…

linux性能监控sar

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、sar是什么&#xff1f;二、安装sar三、主要命令使用整体CPU使用统计(-u)各个CPU使用统计(-P)内存使用情况统计(-r)整体I/O情况(-b)各个I/O设备情况(-d)网络…

一朵华为云,如何做好百模千态?

点击关注 文丨刘雨琦、郝鑫 2005年华为提出网络时代的“All IP”&#xff0c;2011年提出数字化时代的“All Cloud”&#xff0c;2023年提出智能时代的“All Intelligence”。 截至目前&#xff0c;华为的战略升级经历了三个阶段。 步入智能化&#xff0c;需要迎接的困难依然…

mysql面试题6:MySQL索引的底层原理,是如何实现的?B+树和B树的区别?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL索引的底层原理,是如何实现的? MySQL索引的底层实现是通过B+树来实现的。B+树是一种多叉平衡查找树,它的特点是能够高效地支持数据的插入…