HTTP POST弹性搜索事件流批量

时间:2014-12-04 00:43:36

标签: node.js asynchronous elasticsearch stream event-stream

我有一个使用流来读取文件的node.js程序(nodejs event stream setting a variable per stream

我想使用相同的程序将此数据写入弹性搜索。我写了一个小写函数

var writeFunction = function(data) {
    //console.log(data);
    var client = request.newClient("http://localhost:9200");
    client.post('/newtest3/1',data,function(err,res,body) {
        return console.log(res.statusCode);
    });
};

并将其与流媒体

联系起来
var processMyFile = function(file) {
    var stream = getStream(file);
    var nodeName = stream.nodeName;
    stream
        .pipe(es.split())
        .on('end',endFunction)
        .pipe(es.map(function(data,cb) {
            processFunction(nodeName,data,cb);
        }))
        .pipe(es.map(function(data,cb) {
            writeFunction(data);
        }));

}

上述工作按预期异步工作并写入数据,但需要花费很长时间。它似乎也可以用作缓冲区,因为写入比读取需要更长的时间。(使用管道的优点)  我知道弹性搜索中有一个批量接口,我可以使用它进行导入。 Kibana入门指南(http://www.elasticsearch.org/guide/en/kibana/current/using-kibana-for-the-first-time.html

中的shakesphere.json示例

这意味着我需要以批量导入所需的格式创建文件,然后运行卷曲程序等。我想避免创建临时文件。

作为流媒体流程的一部分,是否有更简单的方法将数据快速导入elasticsearch

1 个答案:

答案 0 :(得分:1)

elasticsearch-streams将帮助您使用带流的批量接口,而无需先写入json文件。

我相信您的代码或多或少会像这样:

var TransformToBulk = require('elasticsearch-streams').TransformToBulk
var WritableBulk = require('elasticsearch-streams').WritableBulk;
var client = new require('elasticsearch').Client();

var bulkExec = function(bulkCmds, callback) {
  client.bulk({
    index : 'newtest3',
    type  : '1',
    body  : bulkCmds
  }, callback);
};

var ws = new WritableBulk(bulkExec);
var toBulk = new TransformToBulk(function getIndexTypeId(doc) { return { _id: doc.id }; });

var processMyFile = function(file) {
  var stream = getStream(file);

  stream
    .pipe(toBulk)
    .pipe(ws)
    .on('close', endFunction)
    .on('err', endFunction);
}