2 bleszxy bleszxy 于 2016.04.08 16:36 提问

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);
        }
    }

请问大家是怎么做的?

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

求代码,求版本····

5个回答

bleszxy
bleszxy   2016.04.09 14: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
bleszxy   2016.04.08 16: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
bleszxy   2016.04.08 16:48

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

CSDNXIAOD
CSDNXIAOD   2016.04.08 21:45

elasticsearch获取java client实例
elasticsearch获取java client实例
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

bleszxy
bleszxy `这不都是一个套路出来的吗····然后控制台报错。。。
一年多之前 回复
xiaoEter
xiaoEter   2017.09.19 22: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;
    }

    }

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!