Es整合Springboot

126 阅读1分钟
package com.example.demo.service;

import com.alibaba.fastjson.JSON;
import com.example.demo.User;
import com.tdunning.math.stats.Sort;
import lombok.extern.slf4j.Slf4j;
import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.WriteRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @author zhangjun
 * @date 2021/6/21  17:00
 */
@Service
@Slf4j
public class UserServiceImpl<T> implements UserService<T> {
    @Resource
    private RestHighLevelClient restHighLevelClient;


    @Override
    public Boolean insertUser(User user) {
       IndexRequest indexRequest = new IndexRequest("test_es");
        indexRequest.id(user.getId().toString());
        indexRequest.source(JSON.toJSONString(user), XContentType.JSON);
        try {
            indexRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
            IndexResponse index = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
            log.info("index:{}", JSON.toJSONString(index));
        } catch (Exception e) {
            log.error("error:", e);
            return false;
        }
        return true;
    }

    @Override
    public Boolean updateUser(User user) {
        UpdateRequest updateRequest = new UpdateRequest("test_es", user.getId().toString());
        updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
        updateRequest.docAsUpsert(true);
        try {
            updateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
            UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
            log.info("update:{}", JSON.toJSONString(update));
        } catch (Exception e) {
            log.error("error update:", e);
        }
        return true;
    }

    @Override
    public List<T> search(User user, Class<T> clazz) {

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.matchQuery("age", 26));
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(boolQueryBuilder);
        sourceBuilder.from(0);
        sourceBuilder.size(5);
        sourceBuilder.sort("id",SortOrder.DESC);
        SearchRequest searchRequest = new SearchRequest("test_es");
        searchRequest.source(sourceBuilder);
        List<T> list = new ArrayList<>();
        try {
            SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            log.info("search:{}", JSON.toJSONString(search));
            SearchHits hits = search.getHits();
            long totalHits = hits.getTotalHits().value;
            log.info("totalHits:{}",totalHits);
            SearchHit[] searchHits = hits.getHits();
            for(SearchHit searchHit:searchHits){
                T t = JSON.parseObject(searchHit.getSourceAsString(), clazz);
                list.add(t);
            }
        } catch (Exception e) {

        }
        return list;
    }

}
package com.example.demo.util;

import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;

/**
 * @author zhangjun
 * @date 2021/6/21  17:06
 */
@Configuration
public class EsConfig {

    // 集群地址,多个用,隔开
    private static String hosts = "127.0.0.1";
    // 使用的端口号
    private static int port = 9200;
    // 使用的协议
    private static String schema = "http";
    private static ArrayList<HttpHost> hostList = null;

    // 连接超时时间
    private static int connectTimeOut = 1000;
    // 连接超时时间
    private static int socketTimeOut = 30000;
    // 获取连接的超时时间
    private static int connectionRequestTimeOut = 500;
    // 最大连接数
    private static int maxConnectNum = 100;
    // 最大路由连接数
    private static int maxConnectPerRoute = 100;

    static {
        hostList = new ArrayList<>();
        String[] hostStrs = hosts.split(",");
        for (String host : hostStrs) {
            hostList.add(new HttpHost(host, port, schema));
        }
    }

    @Bean
    public RestHighLevelClient client() {
        RestClientBuilder builder = RestClient.builder(hostList.toArray(new HttpHost[0]));
        // 异步httpclient连接延时配置
        builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
            @Override
            public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
                requestConfigBuilder.setConnectTimeout(connectTimeOut);
                requestConfigBuilder.setSocketTimeout(socketTimeOut);
                requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
                return requestConfigBuilder;
            }
        });
        // 异步httpclient连接数配置
        builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
            @Override
            public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                httpClientBuilder.setMaxConnTotal(maxConnectNum);
                httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
                return httpClientBuilder;
            }
        });
        RestHighLevelClient client = new RestHighLevelClient(builder);
        return client;
    }


}
 <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.3.1</version>
       </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.3.1</version>
        </dependency>