ElasticSearch2.1的java api批量建索引方法


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)
本公众号的内容是有关搜索和大数据技术和互联网等方面内容的分享,也是一个温馨的技术互动交流的小家园,有什么问题随时都可以留言,欢迎大家来访!





本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

java计算函数执行时间 - 2015-12-04 17:12:08

定义一个起始时间: long start = System.currentTimeMillis(); //这里是你要执行的程序块。。。。 定义一个结束时间 long end = System.currentTimeMillis(); 程序快执行耗时=start-end;

java小项目,坦克大战完整 - 2015-12-04 17:12:08

终于完成,修改了很多地方,大家如果需要可以看看,java基础知识练手的! ********************************************** //线程主类 import java.awt.Color; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; impo

jstorm安装 - 2015-12-04 17:12:08

关于jstorm单机安装可以参看如下https://github.com/alibaba/jstorm/wiki/%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85 这些是本人在安装过程具体的安装过程以及问题解决 1、安装zeromq wget http://download.zeromq.org/zeromq-3.2.4.tar.gz tar zxf zeromq-3.2.4.tar.gz cd zeromq-3.2.4 ./configure (提示: error: Unable

并发队列 - 2015-12-04 15:12:20

import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ConcurrentQueue {// 一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。//

Java内部类 - 2015-12-04 15:12:10

内部类:定义在一个类里面或者方法里面的类。           编译后生成的两个独立的类: Outer.class 和Outer$Inner.class 。      内部类的分类:         1.静态内部类:静态内部类定义在类中,任何方法外,用static修饰                                 静态内部类只能访问外部类的静态成员。          非静态内部类里面不能定义static属性或者方法        在外部类的外部,要创建一个静态内部类对象不需要外部类对象
 /**   * 将驼峰式命名的字符串转换为下划线大写方式。如果转换前的驼峰式命名的字符串为空,则返回空字符串。/br   * 例如:HelloWorld-HELLO_WORLD   * @param name 转换前的驼峰式命名的字符串   * @return 转换后下划线大写方式命名的字符串   */ public   static   String underscoreName(String name) {      StringBuilder result =   new   StringBuil
程序运行日志对调试程序很有用,JDK提供日志记录功能,网上很多讲述JDK日志功能的帖子只是代码片段,这里提供一个比较完整的案例,主要是注重几个日志相关的类之互相配合使用的关系。代码比较简单,类的说明在手册里也有,就不解释了。   package Town;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.logging.*;/* * Created with

activeMQ 入门学习(一) - 2015-12-04 14:12:18

最近老是听朋友说mq, 趁着工作不忙, 学习了一下 apache 的 activeMQ. 第一次接触, 许多东西都不懂, 请大家多多指教. 此次学习只涉及到接收消息. 1. activeMQ 官方下载地址: http://activemq.apache.org/download-archives.html. 我下载的版本是 5.12.0(Windows) 2. 将下载的 zip 包解压到指定目录: 例如: c:\activeMQ 3. 解压后目录如下 4. 进入 docs, 里面有 index.html

hibernate sql 对象转java对象 - 2015-12-04 14:12:11

修改了一下,增加类型转换。用到了apache的beanutils工具包。 public static T ListT getEntityObjectListByFullSql( final String fullSql, final ClassT clzz) throws Exception { return getHibernateTemplate().execute( new HibernateCallbackListT() { @Override public ListT doInHibernate

java中的多线程 - 2015-12-04 14:12:11

在java中,每一个线程都是由Thread类对象创建和控制的。通常我们有两种方式来创建一个线程,一种是继承java.lang.Thread 类,第二种是创建类的时候实现Runnable接口。下面分别介绍两种方式。 1,继承Thread类 首先创建Thread子类的一个实例,然后重写run方法,然后子类的实例必须调用start()方法之后run方法才被执行. 代码如下: public class MultiThread extends Thread {public void run() {System.out