1. 导入依赖

<dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.4.1</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version>
</dependency>
<dependency><groupId>jakarta.json</groupId><artifactId>jakarta.json-api</artifactId><version>2.0.1</version>
</dependency>

2. 配置文件

  • 配置springboot的application.yml
spring:elasticsearch:rest:# 是否启用esenable: trueuris: localhost:9200host: localhostport: 9200username: elasticpassword: 123456index: indexNamecrtName: http_ca.crt
  • 配置es的自签证书

    • 执行如下命令将es容器中的crt文件复制到本地
      docker cp 容器名称:/usr/share/elasticsearch/config/certs/http_ca.crt .
    • 将crt文件放至springboot项目的resource路径下

3. 编写Java Client配置

package com.dp.search.config;import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.SSLContexts;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;import javax.annotation.PostConstruct;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;/*** es8的Java客户端配置* author:Geng*/
@Configuration
@Slf4j
public class ElasticSearchConfig {@Value("${spring.elasticsearch.rest.host}")private String host;@Value("${spring.elasticsearch.rest.enable}")private boolean enable;@Value("${spring.elasticsearch.rest.port}")private int port;@Value("${spring.elasticsearch.rest.username}")private String userName;@Value("${spring.elasticsearch.rest.password}")private String passWord;@Value("${spring.elasticsearch.rest.crtName}")private String tempCrtName;private static String crtName;@PostConstructprivate void init() {crtName = tempCrtName;}/*** 解析配置的字符串,转为HttpHost对象数组** @return*/private HttpHost toHttpHost() {HttpHost httpHost = new HttpHost(host, port, "https");return httpHost;}@Beanpublic ElasticsearchClient clientByPasswd() throws Exception {ElasticsearchTransport transport = getElasticsearchTransport(userName, passWord, toHttpHost());return new ElasticsearchClient(transport);}private static SSLContext buildSSLContext() {ClassPathResource resource = new ClassPathResource(crtName);SSLContext sslContext = null;try {CertificateFactory factory = CertificateFactory.getInstance("X.509");Certificate trustedCa;try (InputStream is = resource.getInputStream()) {trustedCa = factory.generateCertificate(is);}KeyStore trustStore = KeyStore.getInstance("pkcs12");trustStore.load(null, null);trustStore.setCertificateEntry("ca", trustedCa);SSLContextBuilder sslContextBuilder = SSLContexts.custom().loadTrustMaterial(trustStore, null);sslContext = sslContextBuilder.build();} catch (CertificateException | IOException | KeyStoreException | NoSuchAlgorithmException |KeyManagementException e) {log.error("ES连接认证失败", e);}return sslContext;}private static ElasticsearchTransport getElasticsearchTransport(String username, String passwd, HttpHost... hosts) {// 账号密码的配置final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, passwd));// 自签证书的设置,并且还包含了账号密码RestClientBuilder.HttpClientConfigCallback callback = httpAsyncClientBuilder -> httpAsyncClientBuilder.setSSLContext(buildSSLContext()).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).setDefaultCredentialsProvider(credentialsProvider);// 用builder创建RestClient对象RestClient client = RestClient.builder(hosts).setHttpClientConfigCallback(callback).build();return new RestClientTransport(client, new JacksonJsonpMapper());}}

4. 测试连接

@SpringBootTest
public class GulimallSearchApplicationTests {@Autowiredprivate ElasticsearchClient elasticsearchClient;@Testpublic void contextLoads() {SearchResponse<Object> search = null;try {search = elasticsearchClient.search(s -> s.index("bank")//查询name字段包含hello的document(不使用分词器精确查找).query(q -> q.match(t -> t.field("balance").query(16418))), Object.class);} catch (IOException e) {e.printStackTrace();}System.out.println(search);}@SneakyThrows@Testpublic void Search() {String searchText = "mill";Query query = MatchQuery.of(m -> m.field("address").query(searchText))._toQuery();SearchResponse<userTest> search = elasticsearchClient.search(s -> s.index("bank").query(query).aggregations("ageAgg",a->a.terms(t->t.field("age").size(10))).aggregations("ageAve",a->a.avg(av->av.field("age"))).aggregations("balanceAvg",a->a.avg(av->av.field("balance"))), userTest.class);System.out.println(search);AvgAggregate ageAve = search.aggregations().get("ageAve").avg();JSONObject parse = (JSONObject)JSON.parse(String.valueOf(ageAve));System.out.println("平均年龄:"+parse.get("value"));AvgAggregate balanceAvg = search.aggregations().get("balanceAvg").avg();JSONObject parse1 =(JSONObject) JSON.parse(String.valueOf(balanceAvg));System.out.println("平均工资:"+parse1.get("value"));List<LongTermsBucket> ageAgg = search.aggregations().get("ageAgg").lterms().buckets().array();for (LongTermsBucket longTermsBucket : ageAgg) {System.out.println("年龄:"+longTermsBucket.key()+"数量:"+longTermsBucket.docCount());}List<Hit<userTest>> hits = search.hits().hits();for (Hit<userTest> hit: hits) {userTest source = hit.source();System.out.println("内部数据:" + source + " 得分 " + hit.score());System.out.println(source.getEmail());}}
}

Java与es8实战之二:Springboot集成es8的Java Client相关推荐

  1. java与es8实战之五:SpringBoot应用中操作es8(带安全检查:https、账号密码、API Key)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

  2. java与es8实战之四:SpringBoot应用中操作es8(无安全检查)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

  3. Java秒杀系统实战系列~构建SpringBoot多模块项目

    摘要:本篇博文是"Java秒杀系统实战系列文章"的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项 ...

  4. java quartz 动态执行,浅谈SpringBoot集成Quartz动态定时任务

    SpringBoot自带schedule 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 注意在程序启动的时候加上@EnableScheduling @Schedule ...

  5. java并发编程实战(二)

    java并发编程中常常会用到两种容器来存放一些数据,这些数据需要保证能在多线程下正常访问.常见的容器分为两类:同步容器和并发容器.在java并发编程实战一书中的第五章也有讲解. 什么是同步容器以及优劣 ...

  6. (十二)java springcloud b2b2c多用户商城系统-springboot集成apidoc

    b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.首先声明下,apidoc是基于注释来生成文档的,它不基于任何框架,而且支持大多数编程语言,为了springboot系列的完整性,所以标 ...

  7. SpringBoot实战(十二)之集成kisso

    关于kisso介绍,大家可以参考官方文档或者是我的博客:https://www.cnblogs.com/youcong/p/9794735.html 一.导入maven依赖 xsi:schemaLoc ...

  8. MP实战系列(二)之集成swagger

    其实与spring+springmvc+mybatis集成swagger没什么区别,只是之前写的太不好了,所以这次决定详细写. 提到swagger不得不提rest,rest是一种架构风格,里面有对不同 ...

  9. JAVA RESTful WebService实战笔记(二)

    资源定位之注解相关简介 @QueryParam注解 JAX-RS2定义了@QueryParam注解来定义查询参数,如下表所示 接口描述 资源地址 分页查询列表数据 /query-resource/te ...

最新文章

  1. Android逆向--如何调试smali代码?
  2. 基于Springboot实现旅游网站系统开发
  3. 将cocos2dx项目从Visual Studio 迁移到 xcode
  4. 西安python工资怎么样-干货|python人工智能工程师工资多少钱
  5. dplayer js控制 自动全屏_Qt编写安防视频监控系统18-云台控制
  6. oracle 游标内存自动释放,详解Oracle隐式游标和显式游标
  7. Linux开机启动过程(9):进入内核入口点之前最后的准备工作
  8. @WebService作用
  9. 将ostream 对象转换成字符串流输出
  10. stringstream 使用方法
  11. 多语言可视化编辑webControl 2.0版
  12. ArcGIS中GWR模型的构建
  13. 数学_余弦距离不满足三角不定式简单证明
  14. xdp 程序如何挂载
  15. SEO优化:自建站图片优化攻略
  16. php中各种括号的使用方法,PHP的大括号(花括号{})使用详解
  17. 目标检测中的mAP是什么含义?
  18. 麻省理工计算机科学硕士,2020年麻省理工学院排名TFE Times美国最佳计算机科学硕士专业排名第4...
  19. 小傻蛋的妹妹跟随小甲鱼学习Python的第十二节012
  20. google i/o_谷歌在I / O 2017上宣布的最好的东西

热门文章

  1. 怎样卸载计算机更新程序,windows10升级程序卸载怎么操作_windows10升级程序怎样卸载删除-win7之家...
  2. 【新知实验室TRTC】
  3. 如何安装windows操作系统?(win10、Window11、win7、win8)
  4. 微信小程序联盟:官方文档+精品教程+demo集合(12月更新……)
  5. Tensorflow神经网络框架 小例子 三层神经网络 卷积神经网络 循环神经网络 神经网络可视化
  6. 面向移动设备的html5开发框架
  7. SCSS 中这些技巧,你可能还不知道!
  8. 句法分析(PCFG,Transition-based parsing)
  9. 麻省理工学院计算机博士奖学金,NWU这位高颜值学霸小姐姐,获麻省理工博士全额奖学金录取!...
  10. hdmi怎么支持2k分辨率_HDMI版本小科普及毕亚兹HDMI高清线体验