在项目中,jestClient还有在使用,RestHighLevelClient没有怎么被使用。现在对其做一个对比,方便技术使用上方便切换。

 

一:JestClient

1.说明

  JestClient是一款基于HTTP实现的ES客户端,在RestHighLevelClient出现之前,它填补了ES缺少HTTP REST接口客户端的空白。JestClient具有一定的ES服务端版本兼容性,支持数据的同步和异步操作,同时,它也提供了索引时和搜索结果的POJO映射机制,即OR-Mapping功能。但是目前主键被RestHighLevelClient取代

 

2.配置客户端

package com.jun.fastpro.config;

import io.searchbox.client.JestClient;
import io.searchbox.client.JestClientFactory;
import io.searchbox.client.config.HttpClientConfig;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * jestClient的配置
 */
@Data
@Configuration
@ConfigurationProperties("elasticsearch")
public class JestClientElasticConfig {

    /**
     * 基础服务ES地址
     */
    private List<String> basicUrls;

    /**
     * 中心ES地址
     */
    private List<String> centerUrls;

    @Bean("basicJestClient")
    public JestClient basicJestClient() {
        JestClientFactory factory = new JestClientFactory();
        factory.setHttpClientConfig(new HttpClientConfig
                .Builder(basicUrls)
                .multiThreaded(true)
                .build());
        return factory.getObject();
    }

    @Bean("centerJestClient")
    public JestClient centerJestClient() {
        JestClientFactory factory = new JestClientFactory();
        factory.setHttpClientConfig(new HttpClientConfig
                .Builder(centerUrls)
                .multiThreaded(true)
                .build());
        return factory.getObject();
    }
}

 

3.使用

    /**
     * 查询
     */
    public <T> List<T> getByParams(JestClient jestClient, EsQuery<T> query) {
        try {
            String index = query.getIndex();
            if (StringUtils.isBlank(index)) {
                throw new RuntimeException("索引不能为空");
            }
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            BoolQueryBuilder bool = QueryBuilders.boolQuery();
            Map<String, Object> params = query.getParams();
            for (Map.Entry<String, Object> entry : params.entrySet()) {
                String name = entry.getKey();
                Object value = entry.getValue();
                if (value instanceof List || value instanceof Set) {
                    bool.filter(QueryBuilders.termsQuery(name, (Collection<?>) value));
                } else {
                    bool.filter(QueryBuilders.termQuery(entry.getKey(), entry.getValue()));
                }
            }
            searchSourceBuilder.query(bool);
            searchSourceBuilder.from(0);
            searchSourceBuilder.size(1000);
            log.info("query json:{}", searchSourceBuilder.toString());
            Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(index).addType("_doc").build();
            SearchResult result = jestClient.execute(search);
            return result.getSourceAsObjectList(query.getClazz(), true);
        } catch (Exception e) {
            log.error("查询es异常", e);
            return null;
        }
    }

 

二:HighLevelClient

1.配置

package com.jun.fastpro.config;


import lombok.Data;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;
import java.util.List;

/**
 * restHighLevelClient配置
 */
@Data
@Configuration
@ConfigurationProperties("highlevel")
public class HighLevelConfig {

    private List<String> uris;

    //配置高级客户端
    @Bean(name = "highClient")
    public RestHighLevelClient initSimpleClient() {
        HttpHost[] httpHosts = uris.stream().map(url -> {
            String[] hostParts = url.split(":");
            String host = hostParts[0];
            int port = Integer.parseInt(hostParts[1]);
            return new HttpHost(host, port, HttpHost.DEFAULT_SCHEME_NAME);
        }).toArray(HttpHost[]::new);

        return new RestHighLevelClient(RestClient.builder(httpHosts));
    }

}

 

2.使用

    /**
     * 公共的查询
     */
    private SearchResponse commonQuery(String index, QueryBuilder queryBuilder, int from, int size) {
        SearchRequest searchRequest = new SearchRequest(index);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(queryBuilder);
        searchSourceBuilder.from(from);
        searchSourceBuilder.size(size);
        searchRequest.source(searchSourceBuilder);
        try {
            return highClient.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

 

三:比较

1.

  第一步都是QueryBuilder的构建

  第二步都是SearchSourceBuilder构建,将第一步构建的信息放到query中

  第三步和第四步有所不同。

 

  hightLevel:

  第三步:SearchRequest.source(),将上一步的SearchSourceBuilder放进来。

  第四步,client.search(SearchRequest)

 

  jestclient:

  第三步:new Search.Builder(),将上一步的SearchSourceBuilder放进来。

  第四步:client.execute()

 

 posted on 2023-03-25 17:04  曹军  阅读(626)  评论(0编辑  收藏  举报