分享

elasticsearch索引数据导入导出

 msxr369 2016-12-27

最近,因为业务需求,需要把一个集群的索引数据导入到另外一个索引中去,就是简单的读取索引文件并且将读到的数据写入到索引中,代码如下(注意,代码适应es2.0版本以下,其中参数path格式为:索引数据路径,一直指向到../索引名称/分片数/index这块):

  1. public static void executeRecreate(String path, String indexName,  
  2.             String indexType) {  
  3.         Settings settings = ImmutableSettings.settingsBuilder()  
  4.                 .put("cluster.name", "es").put("client.transport.sniff", true)  
  5.                 .put("client.transport.ping_timeout", "30s")  
  6.                 .put("client.transport.nodes_sampler_interval", "30s").build();  
  7.         TransportClient client = new TransportClient(settings);  
  8.         client.addTransportAddress(  
  9.                 new InetSocketTransportAddress("127.0.0.1", 9300));  
  10.   
  11.         File file = new File(path);  
  12.         try {  
  13.             Directory dir = FSDirectory.open(file);  
  14.             IndexReader reader = DirectoryReader.open(dir);  
  15.             IndexSearcher searcher = new IndexSearcher(reader);  
  16.   
  17.             int maxDoc = reader.maxDoc();  
  18.             int docNum = 0;  
  19.             BulkRequestBuilder bulkBuilder = new BulkRequestBuilder(client);  
  20.             for (int i = 0; i < maxDoc; i++) {  
  21.                 Document doc = searcher.doc(i);  
  22.                 List<IndexableField> ifList = doc.getFields();  
  23.                 for (IndexableField iField : ifList) {  
  24.                     if ((iField instanceof StoredField)) {  
  25.                         BytesRef bytesRef = ((StoredField) iField)  
  26.                                 .binaryValue();  
  27.                         IndexRequest req = (IndexRequest) new IndexRequestBuilder(  
  28.                                 client, indexName).setType(indexType)  
  29.                                         .setSource(bytesRef.utf8ToString())  
  30.                                         .request();  
  31.                         bulkBuilder.add(req);  
  32.                         docNum++;  
  33.                     }  
  34.                 }  
  35.                 if (i == maxDoc - 1) {  
  36.                     bulkBuilder.execute();  
  37.                 } else if (docNum == 1000) {  
  38.                     bulkBuilder.execute();  
  39.   
  40.                     bulkBuilder = new BulkRequestBuilder(client);  
  41.                     docNum = 0;  
  42.                 }  
  43.             }  
  44.         } catch (Exception e) {  
  45.             System.out.println("fail message :" + e.getMessage());  
  46.         }  
  47.     }  

然而,最新我又发现一个开源的小工具:elasticdump,他也是可以实现导出一个索引的数据到文件中,并且可以导出索引数据到另一个集群的索引中等等功能(更详细的可以参照github:https://github.com/taskrabbit/elasticsearch-dump)

不过,我测试了下,他有个缺点,就是执行的速度比较慢,没有我上面的那个直接读文件再写快速。

我也简单介绍下其使用:

1.首先需要安装nodejs和npm

下载nodejs压缩包(可以到我的资源下载,也可以到官网下载),解压缩,进去,会看到bin目录下有两个文件,node和npm

2.然后通过下面两步将node和npm加到环境变量中

  ln -s /tools/node-v0.10.32-Linux-x64/bin/node /usr/local/bin/node
ln -s /tools/node-v0.10.32-linux-x64/bin/npm /usr/local/bin/npm

通过node -v和npm -v可以查看到版本号,准备工作就OK了

3.可以安装elasticdump了

npm install elasticdump -g

4.安装完成后,就可以使用了,下面举一个例子(将索引a中的数据导入到索引b中):

elasticdump --input=http://localhost:9200/a --output=http://localhost:9200/b --type=data


大家在平常遇到这种需求的时候,以上两种方式都可以使用,就是第二种方式有点慢。

有问题欢迎交流哈。。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多