CloudSearchドメインのデータをエクスポートする

Amazon CloudSearchに取り込んだドキュメントをエクスポートする方法を調べました。


上記記事を参考にNode.jsでエクスポートができます。


sdkをインストールしておきます。
$ npm install aws-sdk
var AWS = require('aws-sdk');
var fs = require('fs');

AWS.config.update({
        accessKeyId: '*****************',
        secretAccessKey: '*********************************',
        region: 'ap-northeast-1',
        endpoint: 'search-hogehoge-fdsfajfpfaihfaophsdfpafd.ap-northeast-1.cloudsearch.amazonaws.com'
});

var batchSize = 10000;  // 一度に取得するドキュメント数
var maxBatchCount = 5;  // 取得回数

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 | maxBatchCount <= current) {
            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 export-all.js all-data.json
で実行。

ちょっと改造して取得ドキュメントの最大数を設定できるようにしています。

また、インデックスにreturnが設定されてない項目は取得することができません。

マネジメントコンソールからエクスポートをサポートして欲しい…。