【问题标题】:AWS CloudSearch export/download dataAWS CloudSearch 导出/下载数据
【发布时间】:2013-12-16 22:28:09
【问题描述】:

我在 AWS CloudSearch 索引中有大约 150 万个文档。这对我来说太贵了,我希望从服务中迁移出来。我一直无法看到如何从索引中下载或导出我的文档。有可能吗?

【问题讨论】:

    标签: amazon-web-services amazon-cloudsearch


    【解决方案1】:

    出于类似的需求,我必须浏览整个 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();
    }
    

    这个脚本必须从命令行调用:node script.js fileToCreate.json

    注意:我不知道这是否适用于 150 万个文档搜索域。我预见的风险是 JSON 变量大小。因此,必须修改此脚本(可能每 100 000 个文档写入一个文件?)。

    【讨论】:

    • 这是什么版本的 API?
    【解决方案2】:

    亚马逊(仍然)不提供从 Cloudsearch 域导出所有数据的方法,但是,编写一个实用程序来自己执行此操作并不难。

    【讨论】:

      【解决方案3】:

      刚刚修复了一些问题,完全归功于@Nek 的回复https://stackoverflow.com/a/32119407/1894553


      先决条件,节点 + aws-sdk 插件

      $ npm install aws-sdk
      

      export-all.js

      请注意,为了获得带有 return: "_all_fields" 参数的完整转储,此字段必须在架构的索引选项中启用标志 return

      var AWS = require('aws-sdk');
      var fs = require('fs');
      
      AWS.config.update({
              accessKeyId: 'xx',
              secretAccessKey: 'xx',
              region: 'xx',
              endpoint: 'xxx'
      });
      
      var batchSize = 10000;
      var compteur = 0;
      var result = [];
      var resultMessage = [];
      
      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 + ' )       ... ');
          }
      
      // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CloudSearchDomain.html#search-property
      params = {
          query:"matchall",
          cursor: (theContext==null)?"initial":theContext.cursor,
          size:batchSize,
          queryParser: "structured",
          return: "_all_fields"
      };
       
          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 argument.\n');
          process.exit();
       } else {
          launchSearch();
      }  
      

      #执行

      $ node export-all.js all-data.json
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-07
        • 1970-01-01
        相关资源
        最近更新 更多