2013-12-16 2 views
5

Ich habe ungefähr 1,5 Millionen Dokumente in einem AWS CloudSearch-Index. Es kostet mich zu viel und ich möchte vom Service abwandern. Ich konnte nicht sehen, wie ich meine Dokumente aus dem Index herunterladen oder exportieren kann. Ist es möglich?AWS CloudSearch Daten exportieren/herunterladen

Antwort

1

Amazon (noch) bietet keine Möglichkeit, alle Daten aus einer Cloudsearch-Domäne zu exportieren, aber es ist nicht schwer, ein Dienstprogramm zu schreiben, um dies selbst zu tun.

3

Für eine ähnliche Notwendigkeit, musste ich meine gesamte CloudSearch-Domäne durchsuchen (mehr als die 10000 Grenze), um eine Datei zu generieren.

verwendete ich ein NodeJS Skript, das zu handhaben, wie folgt aus:

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(); 
} 

Dieses Skript von Kommandozeile aufgerufen werden, ist: Knoten script.js fileToCreate.json

Hinweis: I don‘ Ich weiß, ob dies auf einer Suchdomäne mit 1,5 Millionen Dokumenten korrekt funktioniert. Das Risiko, das ich vorhersehe, ist die Größe der JSON-Variablen. Also, dieses Skript muss angepasst werden (vielleicht schreibt eine Datei alle 100 000 Dokumente?).

Nekloth

+0

Für welche Version der API ist das? – adaam