2013-12-16 16 views
5

AWS CloudSearchインデックスには約150万件のドキュメントがあります。それは私にあまりにも多くの費用がかかっており、私はそのサービスから移行したいと考えています。インデックスからドキュメントをダウンロードまたはエクスポートする方法がわかりません。出来ますか?AWS CloudSearchエクスポート/データのダウンロード

答えて

1

Amazonは(まだ)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

:Iドン」これが1.5百万のドキュメントの検索ドメインで正しく動作するかどうかはわかりません。私が予測するリスクはJSON可変サイズです。ですから、このスクリプトは適合させなければなりません(おそらく100,000文書ごとにファイルを書きますか?)。

ネクロス

+0

これはどのバージョンのAPIですか? – adaam

関連する問題