2013-12-16 48 views
5

我在AWS CloudSearch索引中拥有约150万个文档。这花费我太多,我希望从服务中迁移。我一直无法看到如何从索引下载或导出我的文档。可能吗?AWS CloudSearch导出/下载数据

回答

1

亚马逊(仍然)不提供从Cloudsearch域导出所有数据的方式,但是,编写一个实用程序来自己做这件事并不困难。

3

对于类似的需求,我必须浏览我的整个CloudSearch域(超过10000个限制)才能生成文件。

我用一个脚本的NodeJS来处理,就像这样:

var AWS = require('aws-sdk'); 
var fs = require('fs'); 

AWS.config.update({ 
    accessKeyId: '<yourAccessKey>', secretAccessKey: '<yourSecretAccessKey>', 
    region: '<yourRegion>',endpoint: '<YourSearchDomainEndPoint>' 
}); 

var batchSize = 5000; //Number of item on every search... Max:10000  
var compteur = 0; 
var result = []; 

var params = {query:""}; 
var cloudsearchdomain = new AWS.CloudSearchDomain(params); 

function launchSearch(theContext) { 
    process.stdout.write('Launch AWS.CloudSearch '); 

    if (theContext==null) { 
     process.stdout.write('initial request ... '); 
    } else {   
     var current = (theContext.start/batchSize) +2 ; 
     var totalRun = (Math.ceil(theContext.found/batchSize * 10)/10) + 1; 
     process.stdout.write('(' + current + '/' + totalRun + ')  ... '); 
    } 

    params = { 
      query:"-aQueryStringImpossibleToFind", 
      cursor: (theContext==null)?"initial":theContext.cursor, 
      size:batchSize 
    }; 

    var forCursor = new AWS.CloudSearchDomain(params); 

    forCursor.search(params, function(err, data) { 
     if (err) { 
      console.log("Failed with params :"); 
      console.log(err); 
     } else { 
      resultMessage = data;  
      compteur = compteur + data.hits.hit.length; 
      for(var i=0;i<data.hits.hit.length;i++){ 
       result.push(data.hits.hit[i] 
       }); 
      } 
     } 

     process.stdout.write(resultMessage.hits.hit.length + ' hits found.'); 

     if (resultMessage.hits.hit.length==0) { 
      process.stdout.write(' Done.\n\nLet\'s create thte file...\n'); 
      writeTheFile(result); 
     } else { 
      process.stdout.write('\n'); 
      var myContext = {}; 
      myContext.cursor = resultMessage.hits.cursor; 
      myContext.start = resultMessage.hits.start; 
      myContext.found = resultMessage.hits.found; 
      myContext.retrived = resultMessage.hits.hit.length; 
      launchSearch(myContext); 
     } 
    }); 
} 

function writeTheFile(myResult) { 

    fs.writeFile(process.argv[2], JSON.stringify(myResult), function(err) { 
     if(err) { 
      return console.log(err); 
     } 
    }); 
    process.stdout.write("DONE : File '"+ process.argv[2] + "' generated (" + compteur + " elements).\n"); 
} 



/*Check parameters*/ 
if (!process.argv[2]) { 
    //console.log(process.argv); 
    process.stdout.write('ERROR : the output filename is expected as argumment.\n'); 
    process.exit(); 
} else { 
    launchSearch(); 
} 

这个脚本已经从命令行被称为:节点的script.js fileToCreate.json

注意:我不t知道这是否可以在一个150万个文档搜索域中正常工作。我预先考虑的风险是JSON可变大小。所以,这个脚本必须进行调整(也许一个文件每10万个文件写一次?)。

Nekloth

+0

这是什么版本的API? – adaam