bleszxy
浩_浩
采纳率100%
2016-04-08 08:36 阅读 6.5k
已采纳

elasticsearch java 获取client速度很慢

40

大家好,初学elasticsearch使用版本为1.7.0,java程序每次获取client平均需要3S,这样用搜索的意义就没有了。
看了看网上的帖子说client做成单例模式,每次不关闭client,可是做成单例模式不关闭client,es的控制台会报错,但是client还可以继续使用。
请问大家有没有碰到类似的问题?

获取client代码如下:

 private static final Log log = LogFactory.getLog(ElasticService.class);

    private static Settings settings = ImmutableSettings.settingsBuilder().put("client.transport.ping_timeout", "10s").put("client.transport.sniff", "true").build();

    private TransportClient searchClient = null;

    public TransportClient getElasticClient() throws Exception{
        /**
         * 你可以设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,
         * 把集群中其它机器的ip地址加到客户端中,这样做的好处是一般你不用手动设置集群里所有集群的ip到连接客户端,
         * 它会自动帮你添加,并且自动发现新加入集群的机器。
         */
        try {
            Class clazz = Class.forName(TransportClient.class.getName());
            Constructor constructor = clazz.getDeclaredConstructor(new Class[] { Settings.class });

            constructor.setAccessible(true);
            searchClient = ((TransportClient) constructor.newInstance(new Object[] { settings }));
            searchClient.addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300));
            return searchClient;
        } catch (Exception e) {
            log.error("elasticSearch Client init error :"+e);
            throw new RuntimeException("elasticSearch Client init error", e);
        }
    }

请问大家是怎么做的?

就这么多分了····都贡献了。

求代码,求版本····

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • 已采纳
    bleszxy 浩_浩 2016-04-09 06:12

    经研究发现,每次静态代码调用都是3000-6000毫秒,但是部署到服务器后发现只有第一次是这么长的时间,第二次调用后至以后都不会那么久 也不需要做成单例,每次获取,用完后关闭,不然es控制台会报错 ,报错如下:
    [2016-04-09 14:11:00,457][WARN ][transport.netty ] [Cerebra] exception
    caught on transport layer [[id: 0x79b52975, /192.168.1.101:56796 => /192.168.1.1
    01:9300]], closing connection

    获取时长如下:
    获取client耗时:342
    查询耗时:11
    总共有数据:2
    本次查询数据:2
    {id=1, content=测试Content1, title=测试topicquery1, oper_time=1459328862145}
    {id=2, content=测试Content2, title=测试topicquery2, oper_time=1459328865773}

    获取client实例代码还是上面的代码如下:
    public class ElasticService {

    private static final Log log = LogFactory.getLog(ElasticService.class);
    
    private static Settings settings = ImmutableSettings.settingsBuilder().put("client.transport.ping_timeout", "10s").put("client.transport.sniff", "true").build();
    
    
    public static TransportClient getElasticClient() throws ElasticsearchException{
        /**
         * 你可以设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,
         * 把集群中其它机器的ip地址加到客户端中,这样做的好处是一般你不用手动设置集群里所有集群的ip到连接客户端,
         * 它会自动帮你添加,并且自动发现新加入集群的机器。
         */
        try {
            Class clazz = Class.forName(TransportClient.class.getName());
            Constructor constructor = clazz.getDeclaredConstructor(new Class[] { Settings.class });
    
            constructor.setAccessible(true);
            TransportClient searchClient = ((TransportClient) constructor.newInstance(new Object[] { settings }));
            searchClient.addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300));
            return searchClient;
        } catch (Exception e) {
            log.error("elasticSearch Client init error :"+e);
            throw new ElasticsearchException("elasticSearch Client init error", e);
        }
    }
    

    }

    请大神指正····

    点赞 评论 复制链接分享
  • bleszxy 浩_浩 2016-04-08 08:38
        private static TransportClient searchClient = null;
    
        /**
         * 获取ElaticSearchClient
         * 
         * @author yanghao
         * @throws Exception 
         */
        public static TransportClient getElasticClient() throws Exception {
            if(searchClient == null){
                synchronized (lock) {//防止高并发时创建多个查询对象
                    if (searchClient == null) {
                        searchClient = new ElasticService().getElasticClient();
                    }
                }
            }
            return searchClient;
        }
    

    这是上层获取client代码。

    点赞 评论 复制链接分享
  • bleszxy 浩_浩 2016-04-08 08:48

    大家获取es client是如何做的?请多多指教,谢谢。

    点赞 评论 复制链接分享
  • xiaoEter wtu_奈文魔 2017-09-19 14:14

    import java.net.InetAddress;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.transport.InetSocketTransportAddress;
    import org.elasticsearch.transport.client.PreBuiltTransportClient;
    import org.springframework.stereotype.Component;

    /**

    • @author 作者 duheng:
    • @version 创建时间:2017年9月17日 下午8:48:52 类说明
      */
      @Component
      public class SearchAction {

      public SearchAction(){
      getClient();
      }

      public static TransportClient client;

      public static TransportClient getClient(){
      if(null==client){
      Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
      // 创建client
      try {
      client = new PreBuiltTransportClient(settings)
      .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
      } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      }
      return client;
      }

      }

    我是这么弄的,感觉方法有点笨

    点赞 评论 复制链接分享

相关推荐