es里面提供了两种批量建索引的方法:
1,使用 Bulk Api 特点是:使用比较简单,但控制不够灵活
2,使用Bulk Processor 特点是:使用稍麻烦,控制非常灵活
至于为什么要批量建索引,相信大伙已经不陌生了,为的就是提高写入效率,效率,效率!
数量大的情况下,10ms性能的提升,都有可能带来巨大的优化效果,所以时时刻刻考虑系统的性能无疑是
一个优秀的工程师必须具备的一种素质。
下面来看下在Java中,具体怎么用:
(一)关于Bulk Api用法,这里直接引用es官网的例子了,大伙请直接看截图:
(二)使用Bulk Processor处理也比较简单,注意参数的设置,会影响索引的性能: BulkProcessor实例初始化之后,就可以直接
游标读取添加就行:
/**单例批量处理实例*/ static BulkProcessor bulkProcessor=null; /** 初始化批量配置属性,符合其中一些条件,即会触发批量操作*/ public static void initBulkProcessor()throws Exception{ bulkProcessor=BulkProcessor.builder(client, new BulkProcessor.Listener() { @Override public void beforeBulk(long id, BulkRequest req) { System.out.println("id: "+id+" req: "+req);//发送请求前,可以做一些事情 } @Override public void afterBulk(long id, BulkRequest req, Throwable cause) { System.out.println("id: "+id+" req: "+req+" cause: "+cause.getMessage());//发送请求失败,可以做一些事情 } @Override public void afterBulk(long id, BulkRequest req, BulkResponse rep) { System.out.println("id: "+id+" req: "+req+" rep: "+rep);//发送请求成功后,可以做一些事情 } }).setBulkActions(30000)//达到批量3万请求处理一次 .setBulkSize(new ByteSizeValue(100, ByteSizeUnit.MB))//达到20M批量处理一次 .setConcurrentRequests(10)//设置多少个并发处理线程 .setFlushInterval(TimeValue.timeValueSeconds(50))//设置flush索引周期 .build();//构建BulkProcessor } /**关闭es的bulk请求**/ public static void closeESBulk(){ try{ bulkProcessor.awaitClose(3, TimeUnit.MINUTES);//阻塞至所有的请求线程处理完毕后,断开连接资源 }catch(Exception e){ e.printStackTrace(); } } /**批量建索引伪代码**/ public static void rebuildIndex(){ //使用游标读取mongo或者其他的数据库,然后就可以添加数据 while(new ArrayList<String>().iterator().hasNext()){ Map<String, Object> map=new HashMap<String, Object>();//单条数据使用map组装 bulkProcessor.add(new IndexRequest("index", "type","主键id").source(map)); } closeESBulk();//关闭批量操作 }
建立索引时,可以关闭索引的副本功能,可以极大提高写入效率,但索引完成时,可以执行如下命令动态,添加副本:
curl -XPUT 'localhost:9200/company/_settings' -d '{ "index" : { "number_of_replicas" : 2} }'
最后欢迎大家扫码关注微信公众号:我是攻城师(woshigcs),我们一起学习,进步和交流!(woshigcs)
本公众号的内容是有关搜索和大数据技术和互联网等方面内容的分享,也是一个温馨的技术互动交流的小家园,有什么问题随时都可以留言,欢迎大家来访!