Es整合Springboot

193 阅读2分钟
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 
 * @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 
 * @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>
----空间查询
public class EsServiceImpl implements EsService {
    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Override
    public void test() {
        // 1. 构建地理距离查询条件
        GeoDistanceQueryBuilder geoQuery = new GeoDistanceQueryBuilder("info_geo")
                .point(25.0564, 101.5173)
                .distance(10, DistanceUnit.KILOMETERS)
                .geoDistance(GeoDistance.PLANE);

        GeoDistanceSortBuilder geoSortBuilder = SortBuilders.geoDistanceSort("info_geo", 25.0564, 101.5173)
                .unit(DistanceUnit.KILOMETERS)
                .order(SortOrder.ASC);

        // 2. 组合查询(此处用filter不计算评分,提升性能)
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
                .filter(geoQuery);
        Pageable pageable = PageRequest.of(0, 5);
        // 3. 构造查询对象
        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withFilter(boolQuery)
                .withSorts(geoSortBuilder)
                .withPageable(pageable)
                .build();

        // 4. 执行查询
        SearchHits<MapInfoDocument> hits = elasticsearchRestTemplate.search(searchQuery, MapInfoDocument.class);
        List<MapInfoDocument> collect = hits.stream().map(SearchHit::getContent).collect(Collectors.toList());
    }
}
@Data
@Document(indexName = "map_info")
public class MapInfoDocument implements Serializable {
    /**
     * 数据Id
     */
    @Id
    @Field(value = "id", type = FieldType.Keyword)
    private String id;

    /**
     * 名称
     */
    @Field(value = "name", type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
    private String name;

    /**
     * 专题类型
     */
    @Field(value = "kind", type = FieldType.Keyword)
    private String kind;

    /**
     * 专题类型 参照 KindEnums 表名
     */
    @Field(value = "kind_type", type = FieldType.Keyword)
    private String kindType;

    /**
     * address
     */
    @Field(value = "address", type = FieldType.Text)
    private String address;

    /**
     * telephone
     */
    @Field(value = "telephone", type = FieldType.Text)
    private String telephone;


    /**
     * 经纬度地理位置
     */
    @GeoPointField
    @Field(value = "info_geo")
    private GeoPoint infoGeo;
}