2013-12-16 46 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