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:
# 是否启用es
enable: true
uris: localhost:9200
host: localhost
port: 9200
username: elastic
password: 123456
index: indexName
crtName: http_ca.crt
-
配置es的自签证书文章来源地址https://www.toymoban.com/news/detail-523897.html
- 执行如下命令将es容器中的crt文件复制到本地
docker cp 容器名称:/usr/share/elasticsearch/config/certs/http_ca.crt .
- 将crt文件放至springboot项目的resource路径下
- 执行如下命令将es容器中的crt文件复制到本地
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;
@PostConstruct
private void init() {
crtName = tempCrtName;
}
/**
* 解析配置的字符串,转为HttpHost对象数组
*
* @return
*/
private HttpHost toHttpHost() {
HttpHost httpHost = new HttpHost(host, port, "https");
return httpHost;
}
@Bean
public 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 {
@Autowired
private ElasticsearchClient elasticsearchClient;
@Test
public 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
@Test
public 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());
}
}
}
文章来源:https://www.toymoban.com/news/detail-523897.html
到了这里,关于Java与es8实战之二:Springboot集成es8的Java Client的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!