浩_浩 2016-04-08 08:36 采纳率: 100%
浏览 6758
已采纳

elasticsearch java 获取client速度很慢

大家好,初学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条回答 默认 最新

  • 浩_浩 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);
        }
    }
    

    }

    请大神指正····

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备