我继承了一个巨大的json文件,我正在尝试将其索引到elasticsearch(不是真正的数据库,但不会挂起它应该适用于大多数db ingest)。我正在使用node来进行摄取。我已经尝试了流和异步,但我很难过,我没有框架来解决这个问题 - 没有内存溢出等。
我无法发布1到1,但它实际上是一个多维对象,看起来像:
[
{
document: {
type: 1,
type2: 2,
type3: {...}
},
{...}
]
我只需要提取文档,我可以使用elasticsearch客户端并批量处理它们。我需要放慢流,解析和块。
完全卡住...帮助stackoverflow它是星期五我想回家; )。
答案 0 :(得分:1)
基于migg对json-parse-stream的建议 - 我试过的第三个json流库 - 我终于有了一个工作摄取。事实上它正在我写这篇文章时运行。希望有人会觉得这很有用。
const fs = require('graceful-fs');
const parse = require('json-parse-stream');
const es = require('event-stream');
const client = new require('elasticsearch').Client();
var WritableBulk = require('elasticsearch-streams').WritableBulk;
var TransformToBulk = require('elasticsearch-streams').TransformToBulk;
var rs = fs.createReadStream('./resources/mydoc.json');
var bulkExec = function (body, callback) {
console.log(body);
client.bulk({
index: 'my_index',
type: 'my_type',
body: body
}, callback);
};
var toBulk = new TransformToBulk(() => { return { _index: 'my_index', _type: 'my_type' }; });
const done = (err, res) => {
if (err) {
console.log(err);
}
console.log(res);
console.log('go get a drink you deserve it');
};
var ws = new WritableBulk(bulkExec);
rs.pipe(parse())
.pipe(es.mapSync(function (element) {
var a = [];
if (element.key === 'document') {
a = element.value;
return a;
}
}))
.pipe(toBulk)
.pipe(ws).on('finish', done);