实用篇-ES-RestClient查询文档

一、快速入门

上面的查询文档都是依赖kibana,在浏览器页面使用DSL语句去查询es,如何用java去查询es里面的文档(数据)呢
我们通过match_all查询来演示基本的API,注意下面演示的是 'match_all查询,也叫基础查询'
首先保证你已经做好了 '实用篇-ES-环境搭建' ,创建了名为gghotel的索引库,然后开始下面的操作。如果需要浏览器操作es,那就不需要启动kibana容器

在进行下面的操作之前,确保你已经看了前面 '实用篇-ES-RestClient操作文档' 学的 '1. RestClient案例准备',然后在进行下面的操作


第一步: 在src/test/java/cn.itcast.hotel目录新建HotelSearchTest类,写入如下

package cn.itcast.hotel;

import cn.itcast.hotel.service.IHotelService;
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;

@SpringBootTest
public class HotelIndexTest2 {

     private RestHighLevelClient client;

     @Autowired
     private IHotelService hotelService;

     @Test
     void init(){
          System.out.println(client);
     }

     @BeforeEach
     void setUp(){
          this.client = new RestHighLevelClient(RestClient.builder(
                  //指定你Centos7部署的es的主机地址
                  HttpHost.create("http://192.168.229.129:9200")
          ));
     }

     @AfterEach
     void tearDown() throws IOException {
          this.client.close();
     }


     @Test
     void testMatchAll() throws IOException {
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          request.source().query(QueryBuilders.matchAllQuery());
          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          System.out.println(response);
     }

}

第二步: 把控制台里面我们需要的数据解析出来。返回的数据很多,我们主要是解析hits里面的数据就行了

把HotelSearchTest类修改为如下,主要的修改是sout之前做了一次解析,拿到我们想要的数据

package cn.itcast.hotel;

import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;

@SpringBootTest
public class HotelIndexTest2 {

     private RestHighLevelClient client;

     @Autowired
     private IHotelService hotelService;

     @Test
     void init(){
          System.out.println(client);
     }

     @BeforeEach
     void setUp(){
          this.client = new RestHighLevelClient(RestClient.builder(
                  //指定你Centos7部署的es的主机地址
                  HttpHost.create("http://192.168.229.129:9200")
          ));
     }

     @AfterEach
     void tearDown() throws IOException {
          this.client.close();
     }


     @Test
     void testMatchAll() throws IOException {
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          request.source().query(QueryBuilders.matchAllQuery());
          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          //下面为逐层解析json数据
          SearchHits searchHits = response.getHits();
          long total = searchHits.getTotalHits().value;
          System.out.println("共有" + total + "条数据");
          SearchHit[] hits = searchHits.getHits();
          for (SearchHit hit : hits) {
               String json = hit.getSourceAsString();
               //反系列化
               HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
               System.out.println("hotelDoc = " + hotelDoc);
          }


     }

}

二、match的三种查询

我们刚刚在第一节演示的是 match_all(也叫基本查询) 查询,下面将演示 match(也叫单字段查询) 和 multi_match(也叫多字段查询) 查询

【match 查询,也叫单字段查询】

在HotelSearchTest类添加如下

 @Test
     void testMatch() throws IOException {
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          request.source().query(QueryBuilders.matchQuery("name","如家"));
          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          //下面为逐层解析json数据
          SearchHits searchHits = response.getHits();
          long total = searchHits.getTotalHits().value;
          System.out.println("共有" + total + "条数据");
          SearchHit[] hits = searchHits.getHits();
          for (SearchHit hit : hits) {
               String json = hit.getSourceAsString();
               //反系列化
               HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
               System.out.println("hotelDoc = " + hotelDoc);
          }
     }

【multi_match 查询,也叫多字段查询】

在HotelSearchTest类添加如下

  @Test
     void testMatch() throws IOException {
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          request.source().query(QueryBuilders.multiMatchQuery("如家","name","business"));
          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          //下面为逐层解析json数据
          SearchHits searchHits = response.getHits();
          long total = searchHits.getTotalHits().value;
          System.out.println("共有" + total + "条数据");
          SearchHit[] hits = searchHits.getHits();
          for (SearchHit hit : hits) {
               String json = hit.getSourceAsString();
               //反系列化
               HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
               System.out.println("hotelDoc = " + hotelDoc);
          }
     }

总结: 要构建查询条件,只要记住一个QueryBuilders类即可

三、解析代码的抽取

我们发现对于 match、multi_match、match_all 查询,的解析部分的代码都是相同的,所以我们可以对解析部分的代码进行抽取,如下

快捷键ctrl + alt + M

  private void handleResponse(SearchResponse response) {
          //下面为逐层解析json数据
          SearchHits searchHits = response.getHits();
          long total = searchHits.getTotalHits().value;
          System.out.println("共有" + total + "条数据");
          SearchHit[] hits = searchHits.getHits();
          for (SearchHit hit : hits) {
               String json = hit.getSourceAsString();
               //反系列化
               HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
               System.out.println("hotelDoc = " + hotelDoc);
          }
     }

之后我们在test中只专注于json的获取,解析的任务交给这段代码 

四、bool和term、rang精确查询

原理同上

我们直接演示bool复合查询 

 

 @Test
     void testBool() throws IOException {
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
          boolQuery.must(QueryBuilders.termQuery("city","杭州"));
          boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
          
          request.source().query(boolQuery);
          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          handleResponse(response);
     }

五、排序和分页

 @Test
     void testPageAndSort() throws IOException {
          int pageNum = 1;
          int pageSize = 5;
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          //查询所有
          request.source().query(QueryBuilders.matchAllQuery());
          //排序
          request.source().sort("price", SortOrder.ASC);
          //分页
          request.source().from(pageNum - 1).size(pageSize);

          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          handleResponse(response);
     }

六、高亮显示

 高亮API包括请求DSL构建和结果解析两部分,API和对应的DSL语句如下图,下图只是构建,再下面还有解析,高亮必须由构建+解析才能实现

解析,如下图 

  @Test
     void testHighLight() throws IOException {
          //准备Request
          SearchRequest request = new SearchRequest("hotel");
          //组织DSL参数
          //查询所有
          request.source().query(QueryBuilders.matchQuery("name","如家"));
          //设置高亮匹配方式
          request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
          //发送请求,得到响应结果
          SearchResponse response = client.search(request, RequestOptions.DEFAULT);
          //下面为逐层解析json数据
          SearchHits searchHits = response.getHits();
          long total = searchHits.getTotalHits().value;
          System.out.println("共有" + total + "条数据");
          SearchHit[] hits = searchHits.getHits();
          for (SearchHit hit : hits) {
               String 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);
          }

     }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DTW(Dynamic Time Warping)算法学习应用实践与效率对比分析

DTW&#xff08;Dynamic Time Warping&#xff09;算法是一种用于度量两个时间序列之间的相似性的方法。它的构建原理如下&#xff1a; 基本思想&#xff1a;DTW算法通过计算两个时间序列之间的最小距离&#xff0c;来度量它们的相似性。与欧氏距离等传统距离度量方法不同&…

【文末送书——数学经典著作】工科必备的数学思维培养

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

elementplus DateTimePicker 日期范围选择器 设置默认时间范围为当前月的起始时间到结束时间

代码如下&#xff1a; <el-date-pickerv-model"value"type"datetimerange"start-placeholder"Start Date"end-placeholder"End Date":default-time"defaultTime" />const defaultTime: [Date, Date] [new Date(2000…

Ubuntu18.04安装ROS系统+turtle测试

安装 1.设置安装源 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list sudo sh -c . /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubun…

科技云报道:Citrix正式退出中国市场!国产们谁能真正顶上?

科技云报道原创。 2023年12月3日&#xff0c; Citrix&#xff08;思杰&#xff09;发布的公告将全面生效&#xff0c;中国市场&#xff08;包括香港地区和澳门地区&#xff09;也会停止所有新的交易。 这个消息&#xff0c;无疑是引起了业界的热议&#xff0c;毕竟Citrix可以…

【教3妹学编程-算法题】购买物品的最大开销

3妹&#xff1a;2哥&#xff0c;听说你今天发工资啦&#xff1f; 请我吃饭怎么样&#xff0c;嘿嘿 2哥 : 切&#xff0c;你上周还发工资了呢&#xff0c;也没见你请我吃饭。 3妹&#xff1a;哎呀&#xff0c; 我的工资都用来双11 shopping了&#xff0c; 双11过后我都吃了1周土…

Android Jetpack的组件介绍,常见组件解析

jetpack组件有哪些 Android Jetpack是一个集成Android应用程序组件的一站式解决方案。它使开发人员能够专注于他们的应用程序的真正创新部分&#xff0c;而不会受到Android平台特定的限制。Jetpack组件可分为四个类别&#xff1a; 架构组件&#xff08;Architecture Componen…

C++初阶-模板初阶

模板初阶 一、泛型编程二、函数模板2.1函数模板概念2.2函数模板格式2.3函数模板的原理2.4函数模板的原理2.5模板参数的匹配原则 三、类模板3.1类模板的定义格式3.2类模板的实例化 一、泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& …

IntelliJIDEA快捷键中文版

IntelliJIDEA快捷键中文版&#xff0c;对于Android Studio也适用。官方快捷键链接在此&#xff0c;官方上是英文的&#xff0c;我于2023-11-16下载并翻译成中文&#xff0c;可能翻译不太准&#xff0c;所以英文我都保留下来了&#xff0c;大家可以对比着看&#xff0c;有些英文…

Python语言:面向对象——类与对象初体验

什么是面向对象的编程思想&#xff1f; 我就知道他是一种编程思想&#xff0c;因资历尚浅&#xff0c;没有悟到面向对象的精髓和奥秘所在&#xff0c;只好援引一下chatgpt给我的答案了。 接下来到了分析类与对象的实质是什么了&#xff0c;这个我倒是知道&#xff0c;以下是我的…

用strtok和指针数组构造一个能对字符转进行解析的函数

代码如下 #include<stdio.h> #include<string.h> #include<stdlib.h> int msg_deal(char *msg_src, char *msg_done[],char *str)//返回切割了多少次 {msg_done[0] msg_src;int i 0;while((msg_done[i] strtok(msg_done[i], ",")) && …

OpenVPN服务器搭建与OpenVPN客户端访问

1.服务器搭建: 操作系统 ubuntu 22.04: 安装OpenVPN服务器前先更新系统 2.下载OpenVPN安装脚本: wget https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh 3.给脚本运行权限: chmod +x openvpn-install.sh 4.运行脚本进行OpenVPN服务器…

收集整理微信小程序源码精选8500套(不同行业的源码集合)/带后台+含搭建开发教程

这下面分享的是精心收集整理的微信小程序源码精选8500套&#xff0c;它含有不同行业的源码集合&#xff0c;带后台&#xff0c;而且含搭建开发教程。可以转存起来&#xff0c;需要的时候直接搜索关键词查找就行了&#xff0c;方便得很。 很多伙伴学习小程序不知怎么开始&#…

轻松预览:Axure RP在线原型展示指南,快速掌握!

当UI设计师想要提供功能和细节丰富的原型时&#xff0c;可以使用原型设计工具预览Axure原型。原型设计工具Axurerp作为线框图和原型制作工具的创始人&#xff0c;功能非常强大。取代Axure的国产原型设计工具即时设计&#xff0c;界面布局清新&#xff0c;非常适合复杂的原型设计…

DNS正向解析和主从复制

目录 概念 DNS解析 例&#xff1a;www.baidu.com. 解析过程 DNS查询方式 DNS的查询过程 DNS软件bind 正向解析&#xff08;根据域名查找ip地址&#xff09; 1.先安装bind软件 2.打开网卡配置文件 将DNS1改为自己本机 &#xff08;更改完配置重启服务&#xff09; 3.打…

Java_实现图书管理系统

目录 前言 框架核心思想 框架的实现 书类和书架类的实现 功能接口实现 功能的声明 父类用户和子类管理员&#xff0c;子类普通用户 Main方法 前言 java图书管理系统的详细解析;从思考到实现,一步步带你学会图书管理系统. 框架核心思想 下图只是一个图书管理系统的初步…

【源码系列】情侣游戏小程序系统开发飞行棋扫雷大冒险

系统介绍 情侣游戏小程序系统&#xff0c;为情侣们提供了一种全新的互动方式。通过专属的游戏体验、创新的游戏玩法、丰富的道具与场景、个性化定制以及实时互动与社交等功能&#xff0c;该系统让爱情在棋盘上飞舞&#xff0c;为情侣们带来了更多的乐趣和益处。随着技术的不断…

Python实现求解上个工作日逻辑

目录 一、需求描述二、代码实现三、测试结果 一、需求描述 因工作需要&#xff0c;现需获取任意一个日期的上个工作日&#xff0c;要求考虑法定假日及周末。 例如&#xff1a;2024年2月10日&#xff08;春节&#xff09;的上一个工作日为2024年2月9日&#xff0c;2024年2月17…

【C++】数组中出现次数超过一半的数字

代码&#xff1a; class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param numbers int整型vector * return int整型*/int MoreThanHalfNum_Solution(vector<int>& numbers) {int …

spring学习笔记-IOC,AOP,事务管理

目录 概述 什么是spring 侵入式的概念 spring的核心 spring的优势 注意 IOC控制反转 概述 核心 容器 DI&#xff0c;dependency injection依赖注入 概念 注入方式 循环依赖 spring如何解决循环依赖 spring生成Bean的方式 Bean属性注入&#xff08;Bean属性赋值…