RestHighLevelClient访问ES的使用实例

依赖项

<!--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;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值