Node.js HTTP POST弹性搜索事件流批量
我有一个node.js程序,它使用streams读取文件() 我想使用相同的程序将这些数据写入弹性搜索。我写了一个小的写函数Node.js HTTP POST弹性搜索事件流批量,node.js,asynchronous,elasticsearch,stream,event-stream,Node.js,Asynchronous,elasticsearch,Stream,Event Stream,我有一个node.js程序,它使用streams读取文件() 我想使用相同的程序将这些数据写入弹性搜索。我写了一个小的写函数 var writeFunction = function(data) { //console.log(data); var client = request.newClient("http://localhost:9200"); client.post('/newtest3/1',data,function(err,res,body) {
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入门指南()中的shakesphere.json示例
这意味着我需要以大容量导入所需的格式创建一个文件,然后运行curl程序等。我希望避免创建临时文件
是否有更简单的方法将数据更快地导入elasticsearch,作为流式处理的一部分将帮助您使用流式处理的批量接口,而无需先编写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);
}