es连接—TransportClient、JestClient

项目开发用到es,对于连接方式使用到了两种,总结一下对两种方式做一下对比。

1.使用传输机客户端来连接(即使用TransportClient来创建)

依赖:


            org.elasticsearch
            elasticsearch
            5.2.2
        

        
            org.elasticsearch.client
            transport
            5.2.2
        

        
            org.elasticsearch.plugin
            transport-netty4-client
            5.2.2
                                       

代码:

private static Settings getSettingInstance(){
        if(settings==null){
            synchronized (Settings.class) {
                if(settings==null){
                    settings = Settings.builder()
// 客户端嗅探整个集群的状态,把集群中其它机器的ip地址自动添加到客户端中,并且自动发现新加入集群的机器
                            .put("cluster.name",集群名称)
                            .put("client.transport.sniff", true)
                            .put("client.transport.ping_timeout", "20s")
                            .put("client.transport.nodes_sampler_interval","20s")
                            .build();
                }
            }
        }
        return settings;
    }
    public static TransportClient getConnection() throws UnknownHostException {
        //创建客户端client
        if (client == null) {
            //同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建)
            synchronized (TransportClient.class) {
                if (client == null) {
                    client = new PreBuiltTransportClient(getSettingInstance())                                 //10.166.114.151   172.24.4.58
                            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(EsUtil.getClusterIp()), Integer.parseInt("9300")));
                }
            }
        }
        return client;
    }

该方式需要java编写,是一种轻量级的客户端,发送请求到远端集群中的节点,作为集群和应用层之间的通信层。
优点:启动速度快,轻量级,可创建极多连接,与应用程序解耦。
缺点:分发或查询数据速度较慢,不能获取指定节点数据。
说明:9300端口连接的方式,使用的过程中遇到连接断开的问题,无法获取到集群节点,这个bug很困惑,一直未解决,有朋友知道的希望指点一下。

JestClient连接

使用9300连接,需要自己封装,比较麻烦,所以使用了jestClient连接方式,个人感觉好用。
依赖:


            org.springframework.boot
            spring-boot-starter-data-elasticsearch
        

        
            io.searchbox
            jest
            5.3.2
        

配置:

spring.elasticsearch.jest.uris=http://172.24.4.58:9200
spring.elasticsearch.jest.read-timeout=5000

代码:

public class PersonRecordService {
    private static final Logger logger= LogManager.getLogger(OtherSearchService.class);
    //注入jestClient
    @Resource
    private JestClient jestClient;
    /**
     * 人员档案基本信息查询
     * @param sfeVO
     * @param resultVO
     * @return
     */
    public String getPerSonBaseInfo(SingleFiledEsVO sfeVO, ResultVO resultVO){

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //封装数据
        List> list = new ArrayList<>();
      //创建查询
        MatchPhrasePrefixQueryBuilder mab = QueryBuilders.matchPhrasePrefixQuery(
                sfeVO.getFiledName(),sfeVO.getFiledValue());
        QueryBuilder qb = QueryBuilders.boolQuery().must(mab);
        searchSourceBuilder.query(qb);
      //指定获取字段
        searchSourceBuilder.fetchSource(new String[]{"XM", "GMSFHM" ,"MZ","CSRQ","XB","JG_SSSF","JG_SSCS"}, new String[]{});
        //指定超时时间
        searchSourceBuilder.timeout(new TimeValue(2000));
        //分页
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(20);
        Search search = new Search.Builder(searchSourceBuilder.toString())
                .addIndex(sfeVO.getIndex())
                .addType(sfeVO.getType())
                .build();
        try {
            SearchResult result = jestClient.execute(search);
                List> hits = result.getHits(Map.class);
                for (SearchResult.Hit hit : hits) {
                    //获取所有内容
                    Map map = hit.source
                    list.add(map);
                }
            }
        } catch (IOException e) {
            System.out.println("获取最后轨迹失败");
        }
            resultVO.setErrorNo("0");
            resultVO.setErrorMsg("获取数据成功");
            resultVO.setResults(list);
        return JSON.toJSONString(resultVO);
    }

优点:
1)提供Restful API, 原生ES API不具备;
2)若ES集群使用不同的ES版本,使用原生ES API会有问题,而Jest不会;
3) 更安全(可以在Http层添加安全处理)。
暂时总结这么多,使用过程感觉不错,作为新手快速上手是个不错的选择,不需要了解很多,直接可以进行开发。

你可能感兴趣的:(es连接—TransportClient、JestClient)