RestHighLevelClient封装使用,Java调用ES客户端 [支持ES6.x]

2023-11-09

前言:之前做项目的时候,需要用到Es的操作,本来想使用EsJpa的(即SpringDataElasticsearch),结果项目采用的是SpringBoot1.x版本,不得已,只要自己封装RestHighLevelClient来使用;不过网上查找到的基本都是copy的东西,只好自己写几个

以下为百科:
Java高级别REST客户端(The Java High Level REST Client)以后简称高级客户端,内部仍然是基于低级客户端。它提供了更多的API,接受请求对象作为参数并返回响应对象,由客户端自己处理编码和解码。

每个API都可以同步或异步调用。 同步方法返回一个响应对象,而异步方法的名称以async后缀结尾,需要一个监听器参数,一旦收到响应或错误,就会被通知(由低级客户端管理的线程池)。

高级客户端依赖于Elasticsearch core项目。 它接受与TransportClient相同的请求参数并返回相同的响应对象。

下面是代码:

Pom依赖:使用的是6.4.3版本

<dependency>
      <groupId>org.elasticsearch.client</groupId>
      <artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.4.3</version>
</dependency>

Java 工具类(最简单的获取客户端方式,其他花哨的东西就不写了)

/**
获取客户端
**/
 public static RestHighLevelClient getClient() {
    return new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http")));
  }

下面的client都为上面的getClient()

    /**
     * 根据QueryBuilder来查询全部的条数
     *
     * @param indexName 索引
     * @param typeName  类型
     * @param id   id
     * @return 条数
     * @throws IOException 异常
     */
    public SearchResponse idQuery(String[] indexName, String typeName, String id) throws IOException {
        SearchRequest searchRequest = new SearchRequest(filterIndexName(indexName));
        searchRequest.types(typeName);
        searchRequest.source().query(QueryBuilders.idsQuery().addIds(id));
        return client.search(searchRequest);
    }

    /**
     * 根据QueryBuilder来查询全部的条数
     *
     * @param indexNameArray 索引
     * @param typeName  类型
     * @param builder   查询构建器
     * @return 条数
     * @throws IOException 异常
     */
    public Long getTotalRecords(String[] indexNameArray, String typeName, QueryBuilder builder) throws IOException {
        String[] indexArr = filterIndexName(indexNameArray);
        if(indexArr.length == 0)
            return 0L;
        SearchRequest searchRequest = new SearchRequest(indexArr);
        searchRequest.types(typeName);
        searchRequest.source().query(builder);
        SearchResponse response = client.search(searchRequest);
        return response.getHits().getTotalHits();
    }

    /**
     * 查询全部
     *
     * @param indexName 索引
     * @param typeName  类型
     * @param builder   查询构建器
     * @return SearchResponse
     * @throws IOException 异常
     */
    public SearchResponse findAll(String indexName, String typeName, QueryBuilder builder) throws IOException {
        SearchRequest request = new SearchRequest(indexName);
        request.types(typeName);
        request.source().query(builder);
        return client.search(request);
    }


    /**
     * 分页
     *
     * @param indexNameArray    索引
     * @param typeName     类型
     * @param queryBuilder 参数
     * @param from         从第几条
     * @param size         页面条数
     * @param sortBuilder  排序
     * @return response
     * @throws IOException 异常
     */
    public SearchResponse page(String[] indexNameArray, String typeName, QueryBuilder queryBuilder, int from, int size, SortBuilder sortBuilder)
            throws IOException {
        String[] indexArr = filterIndexName(indexNameArray);
        if(indexArr.length == 0){
            logger.error("选择的时间区间中没有数据");
            return null;
        }
        SearchRequest request = new SearchRequest(indexArr).types(typeName);
        //构建搜寻器
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //参数
        sourceBuilder.query(queryBuilder);
        //排序
        sourceBuilder.sort(sortBuilder);
        //分页
        sourceBuilder.from(from);
        sourceBuilder.size(size);

        request.source(sourceBuilder);
        return client.search(request);
    }


    /**
     * 批量插入数据
     *
     * @param indexName 索引
     * @param typeName  类型
     * @param valueMap  map
     * @return BulkResponse
     * @throws IOException 异常
     */
    public BulkResponse insert(String indexName, String typeName, Map<String, String> valueMap) throws IOException {
        BulkRequest bulkRequest = new BulkRequest();
        Set<String> keySet = valueMap.keySet();
        for (String id : keySet) {
            IndexRequest request = new IndexRequest(indexName);
            request.type(typeName);
            request.index(indexName).id(id).source(valueMap.get(id), XContentType.JSON);
            bulkRequest.add(request);
        }
        return client.bulk(bulkRequest);
    }

    /**
     * 更新- 根据id进行更新(插入时根据id进行覆盖)
     */
    public void update(String indexName, String typeName,String id,String jsonStr)throws IOException{
        insert(indexName,typeName,id,jsonStr);
    }

    /**
     * 批量更新
     */
    public void update(String indexName, String typeName, Map<String, String> valueMap)throws IOException{
        insert(indexName,typeName,valueMap);
    }

    /**
     * 根据id进行删除
     *
     * @param indexName 索引
     * @param typeName  类型
     * @param id        id
     * @throws IOException 异常
     */
    public void delete(String indexName, String typeName, String id) throws IOException {
        DeleteRequest deleteRequest = new DeleteRequest(indexName, typeName, id);
        client.delete(deleteRequest);
    }

    public SearchResponse selectAll(String[] indexName, String typeName) throws IOException {
        SearchRequest searchRequest = new SearchRequest(filterIndexName(indexName));
        searchRequest.types(typeName);
        searchRequest.source().query(QueryBuilders.boolQuery());
        return client.search(searchRequest);
    }

    /**
     * Es文档数据插入(插入前会自动生成index)
     *
     * @param indexName 索引名称
     * @param typeName  类型名称
     * @param id        id
     * @param jsonStr   json数据
     * @return IndexResponse
     * @throws IOException 异常
     */
    public IndexResponse insert(String indexName, String typeName, String id, String jsonStr) throws IOException {
        IndexRequest indexRequest = new IndexRequest(indexName, typeName, id);
        indexRequest.source(jsonStr, XContentType.JSON);
        return client.index(indexRequest);
    }

    /**
     * 过滤不存在的indexName
     *
     * @param indexNameArray 索引数组
     * @return 索引数组
     * @throws IOException 异常
     */
    private String[] filterIndexName(String[] indexNameArray) throws IOException {
        List<String> resultList = new ArrayList<>();
        for (String indexName : indexNameArray) {
            GetIndexRequest request = new GetIndexRequest().indices(indexName);
            boolean exists = client.indices().exists(request);
            if (exists) resultList.add(indexName);
        }
        int size = resultList.size();
        return resultList.toArray(new String[size]);
    }

接下来就是对取到的Es返回值做解析,这个应该很简单了

//这边涉及到业务代码,就不放全了了,简单放几个解析的方法
SearchResponse response = getClient().page(...);
      if (null != response) {
      	//取到hits
        SearchHit[] hits = response.getHits().getHits();
        if (null != hits) {
          for (SearchHit hit : hits) {
            //这就是取到的数据的Json格式数据
            String source = hit.getSourceAsString();
            //使用Gson转换成Bean放进结果list中
            T obj = GsonUtils.read(source, clazz);
            resultList.add(obj);
          }
        }
      }

下面是我们取到的返回值的真实数据
返回值

所以:
SearchHit[] hits = response.getHits().getHits(); 就是获取所取到列表的全部数据
String source = hit.getSourceAsString();然后每一个hit的sourse字符串当然就是取到对象的Json字符串了

以上

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RestHighLevelClient封装使用,Java调用ES客户端 [支持ES6.x] 的相关文章

  • 在Java Servlet中获取通过jquery ajax发送的参数[重复]

    这个问题在这里已经有答案了 我在网上搜索这个主题 但找不到有效的示例 我会很高兴有人能给我帮助 这就是我测试的 ajax url GetJson type POST dataType json contentType application
  • 来自行号的方法名称

    给定特定类源代码 Java C 的行号 是否有一种简单的方法来获取它所属的方法的名称 如果它落入其中 大概使用抽象语法树 这对于将 checkstyle 的输出限制为仅触及的方法很有用 我假设您必须使用抽象语法树来执行 Line gt Me
  • 在java代码中创建postgresql表

    我有一个与 postgreSQL 数据库连接的 java 代码 现在 我希望当它连接到数据库时 我还将创建数据库表 但我的问题是 它不会创建数据库 我不知道问题是什么 这是我的代码 Statement st null ResultSet r
  • Selector.close() 是否关闭所有客户端套接字?

    我是 nio 套接字的新手 我已经使用 nio 套接字编写了一个服务器 现在我正在尝试编写关闭钩子以确保通过清理资源正常退出 我的问题是Selector close 方法关闭所有客户端套接字 如果没有 请告诉我如何访问所有客户端套接字 而无
  • 如何重复一段文本中的每个字母?爪哇语

    就像在口吃中一样 如果文本为 dean 并且乘数为 3 则结果将是 dddeeeaaannn 由提供的乘数指定的次数 public static void repeatLetters String text dean int n 3 Str
  • ZeroDateTimeBehavior=convertToNull 在使用 hibernate 的 jdbc url 中不起作用

    通过 extern 属性文件 url 指定如下 jdbc mariadb xxxxx 3306 xxxxx zeroDateTimeBehavior convertToNull 连接工作正常并且能够查询数据库 通过休眠 我创建了一个映射到带
  • Spring Data Jpa OneToMany 同时保存子实体和父实体?

    这是我的父实体 注意 为了简洁起见 删除了 getter setter lombok 注释 Entity public class Board Id GeneratedValue strategy GenerationType IDENTI
  • 如何将停用词添加到 ElasticSearch 中的默认列表

    我想在默认值中添加更多单词 english 停止 例如 inc incorporated ltd 和 limited 我怎样才能实现这一目标 我当前创建索引的代码如下 谢谢 PUT my index settings analysis fi
  • 是否可以使用 Apache Tika 提取表信息?

    我正在寻找 pdf 和 MS Office 文档格式的解析器 以从文件中提取表格信息 当我看到 Apache Tika 时 正在考虑编写单独的实现 我能够从任何这些文件格式中提取全文 但我的要求是提取表格数据 我希望有 2 列采用键值格式
  • JFrame 在连续运行代码时冻结

    我在使用时遇到问题JFrame 它会冻结 连续运行代码 下面是我的代码 点击时btnRun 我调用了该函数MainLoop ActionListener btnRun Click new ActionListener Override pu
  • 获取接收者的设备令牌以在 Firebase 中发送通知

    所以我正在学习如何使用 firebase 发送设备到设备的通知 我看到了这个answer https stackoverflow com a 42548586 5237289发送通知 看起来很简单 现在 我知道要获取发件人的令牌 它应该如下
  • 如何使用 AffineTransform.quadrantRotate 旋转位图?

    我想旋转一个bitmap关于它的中心点 然后将其绘制成更大的图形上下文 位图是40x40 pixels 图形上下文是500x500 pixels 这就是我正在做的 BufferedImage bi new BufferedImage 500
  • 如何在一次操作中使用 Thymeleaf 检查 null 和空条件?

    有什么方法可以检查 Thymeleaf 中的 null 和empty 条件吗 方法一 1 variable1 variable2 variable3 2 variable null 3 variable 如果我们结合两个条件 例如 vari
  • 在 Spring MVC 中将请求写入文件

    我希望能够将整个请求写入 Spring MVC 控制器中的文件 我已尝试以下操作 但即使我使用大量参数发出 POST 请求 文件也始终为空 RequestMapping method RequestMethod POST value pay
  • 难以理解 通配符

    我有一个非常基本的问题 下面的代码无法编译 假设 Apple Extends Fruit List
  • 如果 Modelmapper 中的整个属性为空,如何排除它们

    ModelMapper 是否 http modelmapper org http modelmapper org 支持什么排除属性 如果该值为空 我刚刚找到了 PropertyMap 但这对我来说是一种限制 因为我必须描述我想要的特定属性
  • 如何更改 JAX-WS Web 服务的地址位置

    我们目前已经公开了具有以下 URL 的 JAX RPC Web 服务 http xx xx xx xx myservice MYGatewaySoapHttpPort wsdl http xx xx xx xx myservice MYGa
  • 假布尔值=真?

    我在一本书中找到了这段代码 并在 Netbeans 中执行了它 boolean b false if b true System out println true else System out println false 我只是不明白为什
  • FragmentMap + ActionBar 选项卡

    我一直在尝试插入一个MapView进入一个ActionBar Tab 但我什至无法解决问题 即使谷歌搜索 这是主要活动 Override public void onCreate Bundle savedInstanceState supe
  • FetchType.LAZY 不适用于休眠中的 @ManyToOne 映射

    简而言之 我的 Child 类与 Parent 类之间存在多对一的关系 我想加载所有的孩子 而不必加载他们的父母详细信息 我的孩子班级是 Entity public class Child implements Serializable I

随机推荐

  • docker安装mysql

    拉取mysql镜像 docker pull mysql 5 7 启动 docker run itd name mysql p 3307 3306 e MYSQL ROOT PASSWORD root mysql 5 7
  • 自组织特征映射网络(SOFM)

    1 SOFM简介 自组织特征映射网络SOFM又称自组织映射网络SOM 是一种自组织竞争神经网络 一个神经网络接受外界输入模式时 将会分为不同的对应区域 各区域对输入模式具有不同的响应特征 而且这个过程是自动完成的 其特点与人脑的自组织特性相
  • Ocaml——Let

    1 并行定义 如果这个变量在并行定义之前没有定义过 那么会出现变量无定义的错误 例如 2 Let局部定义 语法格式如下 let lt 变量 gt lt 表达式1 gt in lt 表达式2 gt 在这个格式中 变量不再是全局有效的变量 他的
  • linux 系统启动盘制作方式

    文章目录 linux 系统启动盘制作方式 制作镜像 制作系统盘 linux 系统启动盘制作方式 制作镜像 解压iso 一定要带着 discinfo productinfo treeinfo 在替换的软件包的Packages 同级目录执行 c
  • 根据获取的经纬度查询用户位置的距离

    在实现需求的时候难免会遇到根据经纬度要获取距离用户定位的位置的距离 今天就跟大家介绍一下怎么使用sql语句获取到距离用户定位位置的距离 要获取用户位置跟店铺的距离需要一些必要参数 第一 必须要获取到用户定位的经纬度 第二必须要有你要查询距离
  • WEB漏洞测试——HTML注入及XSS注入

    HTML注入 原理 目前我们所接触展示页面基本上都是由html来实现的 那么后台在处理内容的时候 是对html很少处理的 如果用户刻意通过输入框 文本框 查询框来填写html js代码 脚本注入 那么就会造成漏洞 若填写恶意网站 病毒网站
  • 基于Qt开发的游戏手柄小程序例子

    以前做过一个项目 用游戏手柄链接上位机软件 控制下位机执行一些机械动作 现在我将手柄控制的功能单独拿出来做了一个手柄检测的小程序 供开发者们拿去移植到自己的项目中用 这个程序是用 Qt creator5 12开发环境开发的 不过移植到VS
  • idea配置hibernate环境-零基础入门-详细版

    idea配置hibernate环境 下载hibernate所需jar包 官网链接 高速链接 用idea创建一个web项目 Create New Project gt 选择Java Enterprise gt 勾选Web Applicatio
  • 嵌入式毕设分享 STM32与wifi的天气预报网时钟系统

    文章目录 0 前言 1 设计内容 2 软件设计 3 关键代码 4 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老
  • 基于FPGA的正弦波发生器设计与实现

    基于FPGA的正弦波发生器设计与实现 摘要 本文介绍了一种基于FPGA的正弦波发生器的设计与实现 通过使用FPGA的数字信号处理功能 可以实现高精度 高性能的正弦波生成 文章首先介绍了DDS Direct Digital Synthesis
  • 《如何为Android Studio安装HAXM》

    Preface 1 Intel HAXM Hardware Accelerated Execution Manager 即英特尔硬件加速执行管理器 Intel HAXM 是一款硬件辅助虚拟引擎 管理程序 使用基于 Intel R Virtu
  • Python|excel表格数据一键转json格式小工具|支持xlsx、xls格式转json|【源码+解析】

    背景 最近在使用JavaScript编写一些浏览器RPA脚本 脚本使用过程中遇到一些问题 脚本使用的数据往往存放在excel表 但运行时只能读取json数据 导致频繁人工excel转json 效率低下 遇到问题后赶紧搜索excel转json
  • Selenium+Webdriver被检测识别出来的应对方案

    在写爬虫 面对很多js 加载的页面 很多人束手无策 更多的人喜欢用Senlenium Webdriver 古语有云 道高一尺魔高一丈 已淘宝为首 众多网站都针对 Selenium的js监测机制 比如 window navigator web
  • 转载:python 文件读写(追加、覆盖)

    with open file txt w as f f write content content 要放入文件的内容 要进行utf 8转码 可在pycharm中打开文件进行转码 x 创建一个新文件并打开它进行写入 b 二进制模式 t 文本模
  • 汇总下关于安全的13款必备工具

    汇总下关于安全的几款必备工具 1 burpsuite Burp Suite 是用于攻击web 应用程序的集成平台 http协议分析神器 里面包括了不少安全必备的功能 重放 爆破 扫描并且支持自定义脚本 实现自己想要的功能 Burp Suit
  • MacBook Big Sur 完美解决外接显示器 字体模糊、边缘不清 HIDPI 解决办法

    该文章转发MacBook Big Sur 完美解决外接显示器 字体模糊 边缘不清 HIDPI 解决办法 毕扬博客
  • error: invalid conversion from ‘void*‘ to ‘char*‘ [-fpermissive]

    include
  • 【计算机视觉】InvaSpread 讲解

    任何的书写错误 排版错误 概念错误等 希望大家包含指正 在阅读本篇之前建议先学习 机器学习 噪声对比估计 NCE 计算机视觉 MoCo 讲解 计算机视觉 InstDis 讲解 InvaSpread 在 InvaSpread 中 负样本的个数
  • 点云数据学习总结之一:点云数据存储格式

    最近研究点云数据 找了下相关的资料 看了许多的博文 下面总结了我认为比较写的比较好的博文链接 有需要的可以看下 刚刚才研究 所以可能不全 欢迎大家补充 共同学习 同时 未避免转载的博客链接失效 所以对博客内容进行了截图 如果原博主觉得受到侵
  • RestHighLevelClient封装使用,Java调用ES客户端 [支持ES6.x]

    前言 之前做项目的时候 需要用到Es的操作 本来想使用EsJpa的 即SpringDataElasticsearch 结果项目采用的是SpringBoot1 x版本 不得已 只要自己封装RestHighLevelClient来使用 不过网上