javascript - Node - 无数据创建的 ES 索引

标签 javascript node.js elasticsearch

我一直在开发一个 AWS Lambda 函数,用于在每次从 Cloudfront 接收日志时对 S3 存储桶发送的通知使用react。 我能够解压缩日志包并使用 Cloudfront Parser 解析它们。

但是,我仍然无法将它们发送到 ElasticSearch 端点。我主要使用 winston-elasticsearchs3-to-logstore但他们都没有工作。

这是我的代码:

exports.handler = function(event, context, callback) {
    var srcBucket = event.Records[0].s3.bucket.name;
    var srcKey = event.Records[0].s3.object.key;

    async.waterfall([
        function fetchLogFromS3(next){
            console.log('Fetching compressed log from S3...');
            s3.getObject({
               Bucket: srcBucket,
               Key: srcKey
            },
            next);
        },
        function uncompressLog(response, next){
            console.log("Uncompressing log...");
            zlib.gunzip(response.Body, next);
        },
        function publishNotifications(jsonBuffer, next) {
            console.log('Filtering log...');
            var json = jsonBuffer.toString();
            console.log('CloudFront JSON from S3:', json);

            var records;
            CloudFrontParser.parse(json, { format: 'web' }, function (err, accesses) {
              if(err){
                console.log(err);
              } else {
                records = accesses;
              }
            });

            // Here, how to send the parsed data? 

            console.log('CloudFront parsed:', records);
        }
    ], function (err) {
        if (err) {
            console.error('Failed to send data: ', err);
        } else {
            console.log('Successfully send data.');
        }
        callback(null,"message");
    });
};

有没有简单的方法向ES发送数据?
类似于:

var client = new elasticsearch.Client({
  host: process.env.ES_HOST,
  log: 'trace',
  keepAlive: false
});

client.index({
        index: 'cloudfront_index',
        type: 'log',
        body: records
        }, function(err, resp, status) {
        console.log(resp);
});

它可以工作,但不会发送数据:

GET cloudfront_index/_search
{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

最佳答案

你就快到了。您需要使用 bulk method实现你想要的:

var client = new elasticsearch.Client({
  host: process.env.ES_HOST,
  log: 'trace',
  keepAlive: false
});

var bulk = [];
records.forEach(function(record) {
    bulk.push({"index": {}})
    bulk.push(record);
});
client.bulk({
        index: 'cloudfront_index',
        type: 'log',
        body: bulk
}, function(err, resp, status) {
        console.log(resp);
});

关于javascript - Node - 无数据创建的 ES 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51018091/

相关文章:

javascript - ES6 promise /在多个 promise 完成后调用函数(不能使用 Promises.all)

javascript - Node.js MySQL 查询无法将 MySQL 结果分配给变量

mysql - 在 Heroku 上部署 MySQL 数据库的 Node.js 应用程序不断崩溃

node.js - Node 单元测试 - TypeError : Cannot read property 'order' of undefined

python - 当我尝试使用脚本从 Elasticsearch 字段中的数组中删除项目时出现错误

javascript - 将 fullcalendar.io 与 JSONP 结合使用

javascript - 无法从 Javascript addEventListener 方法调用 jQuery POST 请求

python - 紧固查询elasticsearch

javascript - 为什么我们对脚本使用 <script> 而对外部 CSS 不使用 <style> ?

java - Spring Boot 2.2.6 Elastic Search 7.6.2 oss 的批量索引不起作用