【工具类】Elasticsearch的HTTP客户端(Java)

news2025/1/16 11:00:18

一、介绍

1. 原理

Java基于Http请求操作ES,与Kibana上的操作一致。

Kibana上的dsl与Http的关系:

  • GET、POST等同于HTTP的POST
  • PUT 等同于HTTP的PUT
  • DELETE 等同于HTTP的DELETE

如图
在这里插入图片描述
该DSL可转化为HTTP请求

POST ip:port/docwrite/_search

请求体为:

{
  "query": {
    "match": {
      "attachment.content": "Seata"
    }
  }
}

2. 对比

已有客户端的缺点:

  • 客户端繁多,语法不一,学习成本高。写完DSL语句后需要根据语法进行转换
  • 客户端版本一致性要求高,同一客户端版本变更后类变化大
  • 部分接口高版本不支持。比如DSL可以使用ingest抽取数据,但是7.20以后的Java客户端不支持

HTTP客户端的优点:

  • DSL即代码,写完DSL后可以放到json文件中直接调用,直观
  • DSL可以实现的,HTTP客户端就可以实现,不受已有客户端版本的影响
  • 无学习成本,返回数据处理灵活

二、使用

// 读取Resource/elasticsearch/QueryArea.json的json数据,即DSL的请求体
 JsonNode jsonNode = JsonFileUtils.readFileToJson("/elasticsearch/QueryArea.json");
// 执行查询语句。result与Kibana的DSL查询结果一致
JsonNode result = elasticsearchRequestUtils.post("/" + indexName + "/_search", jsonNode);

三、源码

Json文件的读取依赖该工具类

  1. 添加配置文件
elasticsearch:
  host: 
  port: 9200
  username: 
  password: 
  connTimeout: 3000
  socketTimeout: 5000
  connectionRequestTimeout: 500
  1. 配置文件实体类
@Data
public class EsConfig {
    protected String host;
    protected int port;
    protected int connTimeout;
    protected int socketTimeout;
    protected int connectionRequestTimeout;
    protected String username;
    protected String password;
}
  1. 请求工具类
package com.dreambyday.http;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;


/**
 * <p> Description:ElasticsearchRequestUtils</p>
 * <p> CreationTime: 2022/10/27 21:09
 *
 * @author dreambyday
 * @since 1.0
 */
public class ElasticsearchRequestUtils {
    private final RestTemplate restTemplate;
    private final String prefix;
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    private final EsConfig esConfig;
    public ElasticsearchRequestUtils(EsConfig esConfig) {
        prefix = "http://" + esConfig.getHost() + ":" + esConfig.getPort();
        this.esConfig = esConfig;
        restTemplate = new RestTemplate();
    }


    /**
     *
     * @param uri uri
     * @param jsonNode 请求体
     * @param <T> com.fasterxml.jackson.databind.JsonNode;com.fasterxml.jackson.core.type.TypeReference<Map<String, Object>>
     * @return 响应body
     */
    public <T>JsonNode post(String uri, T jsonNode) throws JsonProcessingException {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setBasicAuth(esConfig.getUsername(), esConfig.getPassword());
        HttpEntity<T> request = new HttpEntity<>(jsonNode, headers);
        ResponseEntity<String> response = restTemplate.postForEntity(prefix + uri, request, String.class);
        String body = response.getBody();
        return OBJECT_MAPPER.readTree(body);
    }

    public <T>void delete(String uri) throws JsonProcessingException {
        restTemplate.delete(prefix + uri);
    }

    /**
     *
     * @param uri uri
     * @param jsonNode 请求体
     * @param <T> com.fasterxml.jackson.databind.JsonNode;com.fasterxml.jackson.core.type.TypeReference<Map<String, Object>>
     */
    public <T>void put(String uri, T jsonNode) throws JsonProcessingException {
        HttpHeaders headers = new HttpHeaders();
        headers.setBasicAuth(esConfig.getUsername(), esConfig.getPassword());
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<T> request = new HttpEntity<>(jsonNode, headers);
        restTemplate.put(prefix + uri, request);
    }
    public JsonNode get(String uri){
        ResponseEntity<JsonNode> response = restTemplate.getForEntity(prefix + uri, JsonNode.class);
        return response.getBody();
    }
}
  1. 配置类
@Configuration
public class ElasticsearchRequestConfiguration {
    @Bean
    @ConfigurationProperties(prefix = "elasticsearch")
    public EsConfig esConfig() {
        return new EsConfig();
    }
    @Bean
    ElasticsearchRequestUtils elasticsearchRequestUtils() {
        return new ElasticsearchRequestUtils(esConfig());
    }
}

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

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

相关文章

Mysql online DDL工具:gh-ost

gh-ost特点&#xff1a; 1、不使用触发器。 在gh-ost出现之前第三方MySQL DDL工具均采用触发器的方式进行实现&#xff0c;包括前面percona的pt-osc&#xff0c;Facebook的OSC等等。而gh-ost采用的机制和他们完全不同&#xff1a;它通过MySQL binlog来同步数据。 gh-ost会伪装…

PowerToys 微软效率工具包 使用指南

PowerToys 微软效率工具包 使用教程 Microsoft PowerToys 是一组实用程序&#xff0c;供高级用户调整和简化其 Windows 10 和 11 体验以提高工作效率。 下载 PowerToys⇲ 安装教程 1.双击文件运行 点击我同意 2.等待下载安装完成 3.安装完成 使用指南 Always on Top 通…

FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D)

本教程将在Unity3D中混合Optitrack与数据手套的数据流&#xff0c;在人体运动的基础上&#xff0c;添加双手手指部分的运动。 双手手背的角度仍由Optitrack提供&#xff0c;数据手套提供双手手指的角度。 01 客户端软件 分别安装MotiveBody与MotionVenus并校准人体与数据…

Kafka-Topic创建源码分析

Kafka-Topic创建源码分析 在kafka中,创建topic通过使用kafka-topics.sh脚本或者直接调用AdminClient对外提供的adminApi来进行创建. 即使是使用kafka-topics.sh&#xff0c;其最终会通过生成并调用AdminClient来进行处理. 0,创建topic流程图 1,创建topic示例代码 通过引入A…

工作两年半,终于学会了Jenkins部署Maven项目

上期我们讲了Linux部署Jenkins Linux安装Jenkins&#xff08;Java11最新版&#xff09; 这期我们来讲的是使用Jenkins部署一个maven项目 文章目录&#x1f46e;所需要的环境&#xff08;必须要有&#xff0c;否则不能进行下一步&#xff09;&#x1f64b;第一步&#xff0c;安装…

02 运算符

目录 第一章&#xff1a;概述 第二章&#xff1a;算术运算符 2.1 概述 2.2 应用示例 2.3 号的两种用法 2.4 自增自减运算 2.4.1 概述 2.4.2 单独使用 2.4.3 复合使用 第三章&#xff1a;赋值运算符 3.1 概述 3.2 应用示例 第四章&#xff1a;关系运算符&#xff0…

vue3.0找不到模块“./App.vue”或其相应的类型声明

vue3报错提示 找不到模块“/App.vue”或其相应的类型声明 情况一、vue3.0js 报错原因&#xff1a;javascript只能理解.js文件&#xff0c;无法理解.vue文件。 解决方案&#xff1a;根目录新建jsconfig.json {"compilerOptions": {"baseUrl": "./&qu…

被取消的AP考试到底是什么嘞?

最近&#xff0c;好多考试都延期或取消了&#xff0c;美国大学理事会&#xff08;College Board&#xff09;也发布公告&#xff0c;宣布受疫情影响&#xff0c;上海、北京等地的AP考试正式取消&#xff0c;不提供线上考试的机会&#xff0c;而且不会安排后续补考。 这条消息惊…

芯片漫游指南(5)-- UVM寄存器

目录1.寄存器模型概览1.1 概述1.2 uvm_reg相关概念1.3 MCDF寄存器模型1.4 寄存器建模1.5 模型使用流程2.寄存器模型集成2.1 总线UVC的实现2.2 纵向UVC的示例3.寄存器模型的常规方法3.1 mirror、desired和actual value3.2 prediction的分类3.3 uvm_reg的访问方法3.4 mem与reg的联…

python扩展实现方法--python与c混和编程

大部分的Python的扩展都是用C语言写的&#xff0c;但也很容易移植到C中。 一般来说&#xff0c;所有能被整合或者导入到其它python脚本的代码&#xff0c;都可以称为扩展。 扩展可以用纯Python来写&#xff0c;也可以用C或者C之类的编译型的语言来扩展。 就算是相同的架构的两…

Spring Boot学习篇(三)之通用mapper的使用(oracle版)

Spring Boot学习篇(三)之通用mapper的使用(oracle版) 1 配置pom.xml <parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.7.2</version></parent> <de…

概念辨析|电子文件单轨制与电子档案单套制

电子文件单轨制和电子档案单套制是档案业务中的重要概念&#xff0c;在建设数字中国的时代背景下&#xff0c;厘清“套”与“轨”的区别和联系是革新档案工作的基础 产生背景 随着信息技术的不断发展和政务信息化的持续推进&#xff0c;电子文件逐渐在业务工作中大量出现&…

从工具到实践:如何在GitHub上保障开源项目安全?

1998年&#xff0c;Christine Peterson创造了 “开源软件”这个词。她解释道&#xff1a;“这是刻意为之&#xff0c;为了让其他人更容易理解这个领域”。同年&#xff0c;O’Reilly组织了首届“开源峰会”。 开源软件受到更多人青睐原因在于&#xff0c;用户对软件拥有更多的…

【圣诞节】简单代码实现圣诞树|圣诞贺卡 | 快来为心爱的她送上专属的圣诞礼物叭~

圣诞节马上就要到了&#xff0c;不知道给自己喜欢的人准备什么样的惊喜吗&#xff1f;作为一名程序员&#xff0c;当然是用编程制作专属于她or他的圣诞树&#xff01; 目录 &#x1f384;圣诞树 ✨3D圣诞树 代码块 打开方式 修改位置 效果展示 ✨音乐律动圣诞树 代码块…

详解 Vue 过渡 transition 动画 animation 并结合第三方库 animation.css 和 gsap

transition vue过渡组件 标签自带类名 触发时机默认类名 自定义类名 <transition name"xxx"> 自定义行内式类名 方便结合第三方库 transition 钩子 接收参数el enter 和leave 第二个参数 done 可以 决定 after-enter after-leave 的 周期内的执行时机 v-…

YonBuilder移动开发平台 AVM框架 封装虚拟数字键盘组件

AVM&#xff08;Application-View-Model&#xff09;前端组件化开发模式基于标准Web Components组件化思想&#xff0c;提供包含虚拟DOM和Runtime的编程框架avm.js以及多端统一编译工具&#xff0c;完全兼容Web Components标准&#xff0c;同时兼容Vue和React语法糖编写代码&am…

Codeforces Round #697 (Div. 3) E. Advertising Agency

翻译&#xff1a; 玛莎在一家广告公司工作。为了推广新品牌&#xff0c;她想和一些博主签约。玛莎总共有&#x1d45b;个不同的博主。编号为&#x1d456;的博主拥有&#x1d44e;&#x1d456;名粉丝。 由于玛莎的预算有限&#xff0c;她只能与&#x1d458;不同的博主签约。…

LeetCode动态规划—跳跃游戏从跳到头到跳最少下跳到头(45、55)

跳跃游戏跳跃游戏跳跃游戏Ⅱ跳跃游戏 一个下标对应的值为3&#xff0c;那证明这个位置可以跳到前后3个位置的下标处。&#xff08;3均可达&#xff09; 如果依次遍历完这个数组&#xff0c;有下标在跳跃过程中最远位置仍然不可达&#xff0c;即证明无法到达最后一个位置。 可以…

js实现九宫格抽奖功能

分享一下js的九宫格抽奖功能 首先是html部分&#xff1a; <div class"box"><div class"div2">短裙</div><div class"div3">口红</div><div class"div4">草莓</div><div class"div…

【vue】控制台中如何移除数组arr中的值?如何给数组arr中放值?

移除数组arr属性中的值&#xff1a;vm.arr.shift() 新增数组arr属性中的值&#xff1a;vm.arr.push(‘属性值’) 移除atguigu3样式后效果&#xff1a; 向数组arr中添加样式值后效果&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta…