依赖项
<!--Elasticsearch-->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.15.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.15.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>7.15.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.15.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>reindex-client</artifactId>
<version>7.15.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
<version>7.15.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>percolator-client</artifactId>
<version>7.15.0</version>
</dependency>
生成客户端bean
package com.ctsi.config;
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.client.config.RequestConfig;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 生成Es客户端bean
*/
@Configuration
public class ElasticConfig {
@Value("${elasticsearch.hostlist}")
private String hostlist;
@Value("${elasticsearch.username}")
private String username;
@Value("${elasticsearch.password}")
private String password;
@Value("${elasticsearch.connectTimeout:3000}")
private String connectTimeout;
@Value("${elasticsearch.socketTimeout:15000}")
private String socketTimeout;
/**
* 有身份认证
*/
@Bean
@SuppressWarnings("deprecation")
public RestHighLevelClient restHighLevelClient() {
//解析hostlist配置信息
String[] hostPorts = hostlist.split(",");
//创建HttpHost数组,其中存放es主机和端口号的配置信息
HttpHost[] httpHostArray = new HttpHost[hostPorts.length];
for (int i = 0; i < hostPorts.length; i++) {
String item = hostPorts[i];
httpHostArray[i]= new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");
}
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
RestClientBuilder builder = RestClient.builder(httpHostArray)
.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
// requestConfigBuilder.setConnectTimeout(-1);
// requestConfigBuilder.setSocketTimeout(-1);
// requestConfigBuilder.setConnectionRequestTimeout(-1);
// return requestConfigBuilder;
return requestConfigBuilder
.setConnectTimeout(Integer.parseInt(connectTimeout)) // 连接超时(默认为1秒)
.setSocketTimeout(Integer.parseInt(socketTimeout));// 更改客户端的超时限制,默认30秒
}
}).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.disableAuthCaching();
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
/// }).setMaxRetryTimeoutMillis(5*60*1000);
});
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
}
公用类
package com.ctsi.util;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.HttpAsyncResponseConsumerFactory;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
@Slf4j
public class ElasticAccessUtil {
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
public static String getIdxName() {
return "idx_name_" + sdf.format(new Date());
}
public static String getIdxName_last() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -1);
return "idx_name_" + sdf.format(calendar.getTime());
}
/**
* 判断索引是否存在 ~ GetIndexRequest
* @param idxName 索引名
* @return 存在:true; 不存在:false;
*/
public static boolean indexExists(RestHighLevelClient client, String idxName) {
boolean exists = false;
try{
exists = client.indices().exists(new GetIndexRequest(new String[]{idxName}), RequestOptions.DEFAULT);
}catch(IOException ioe){
log.error("判断索引{}是否存在异常:{}", idxName, ioe.getMessage());
try{
Thread.sleep(1000);
exists = client.indices().exists(new GetIndexRequest(new String[]{idxName}), RequestOptions.DEFAULT);
}catch(InterruptedException ie){
ie.printStackTrace();
}catch(IOException ioe2){
log.error("复判索引{}是否存在异常:{},请检查索引连接 !", idxName, ioe2.getMessage());
}
}
return exists;
}
/**
* 查询对象 By Id ~ SearchRequest
* ShenHY 2023-04-13
*/
public static Map getSourceById(RestHighLevelClient client, String idxName, String id) {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().trackTotalHits(true);
/// 过滤条件
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("_id", id));
searchSourceBuilder.query(queryBuilder);
/// 目标字段
//String[] fields = {"srcIp", "appKey", "url", "isSuccess"};
//searchSourceBuilder.fetchSource(fields, null);
// 数量限制
searchSourceBuilder.from(0);
searchSourceBuilder.size(1);
// 目标索引
SearchRequest searchRequest = new SearchRequest(idxName);
searchRequest.source(searchSourceBuilder);
/// 查询数据
// SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
HttpAsyncResponseConsumerFactory consumerFactory =
new HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory(200 * 1024 * 1024); //200MB
builder.setHttpAsyncResponseConsumerFactory(consumerFactory);
SearchResponse response;
try{
response = client.search(searchRequest, builder.build());
}catch(Exception e) {
log.error("查询数据失败({}):{}", id, e.getMessage());
return null;
}
/// 结果解析
SearchHits searchHits = response.getHits();
SearchHit[] searchHitArray = searchHits.getHits();
if(null != searchHitArray && 0 < searchHitArray.length) {
SearchHit hit = searchHitArray[0];
Map<String, Object> map = hit.getSourceAsMap();
return map;
}else{
return null;
}
}
/**
* 保存对象 ~ IndexRequest
* ShenHY 2023-04-13
*/
public static String saveSource(RestHighLevelClient client, String idxName, Object obj){
IndexRequest idxRequest = new IndexRequest(idxName);
try{
idxRequest.source(BeanMapUtil.beanToMap(obj));
}catch(Exception e){
log.error("{} 转化为 Map 异常: {}", obj.getClass(), e.getMessage());
idxRequest.source(obj);
}
try{
client.index(idxRequest, RequestOptions.DEFAULT);
}catch(Exception e){
log.error("{} 存入Es异常:{}", obj.toString(), e.getMessage());
return e.getMessage();
}
return null;
}
/**
* 更新对象 By Id ~ UpdateRequest
* ShenHY 2023-04-13
*/
public static String updateSourceById(RestHighLevelClient client, String idxName, String id, Object bean) {
UpdateRequest updateRequest = new UpdateRequest(idxName, id);
UpdateResponse updateResponse;
try{
updateRequest.doc(BeanMapUtil.beanToMap(bean));
updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
}catch(Exception e) {
log.error("更新数据失败({}):{}",id, e.getMessage());
return e.getMessage();
}
return null;
}
/**
* 更新对象 By Id ~ UpdateRequest
* ShenHY 2023-04-13
*/
public static String updateSourceById(RestHighLevelClient client, String idxName, String id, Map map) {
UpdateRequest updateRequest = new UpdateRequest(idxName, id);
UpdateResponse updateResponse;
try{
updateRequest.doc(map);
updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
}catch(Exception e) {
log.error("更新数据失败({}):{}",id, e.getMessage());
return e.getMessage();
}
return null;
}
}