浩_浩 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条)

报告相同问题?

悬赏问题

  • ¥15 目标计数模型训练过程中的问题
  • ¥100 Acess连接SQL 数据库后 不能用中文筛选
  • ¥15 用友U9Cloud的webapi
  • ¥20 电脑拓展屏桌面被莫名遮挡
  • ¥20 ensp,用局域网解决
  • ¥15 Python语言实验
  • ¥15 我每周要在投影仪优酷上自动连续播放112场电影,我每一周遥控操作一次投影仪,并使得电影永远不重复播放,请问怎样操作好呢?有那么多电影看吗?
  • ¥20 电脑重启停留在grub界面,引导出错需修复
  • ¥15 matlab透明图叠加
  • ¥50 基于stm32l4系列 使用blunrg-ms的ble gatt 创建 hid 服务失败