最近,我一直在使用Elasticsearch Node.js API批量索引大型JSON文件。我已经成功解析了JSON文件。现在,我应该能够将索引就绪数组传递给Elasticsearch bulk命令。但是,使用控制台日志,似乎数组不应该导致任何问题。
以下代码应该采用API URL(带有JSON响应)并使用Node.js HTTP库解析它。然后使用Elasticsearch Node.js API,它应将JSON数组中的每个条目批量索引到我的Elasticsearch索引中。
var APIUrl = /* The url to the JSON file on the API providers server. */
var bulk = [];
/*
Used to ready JSON file for indexing
*/
var makebulk = function(ParsedJSONFile, callback) {
var JSONArray = path.to.array; /* The array was nested... */
var action = { index: { _index: 'my_index', _type: 'my_type' } };
for(const item of items) {
var doc = { "id": `${item.id}`, "name": `${item.name}` };
bulk.push(action, doc);
}
callback(bulk);
}
/*
Used to index the output of the makebulk function
*/
var indexall = function(madebulk, callback) {
client.bulk({
maxRetries: 5,
index: "my_index",
type: "my_type",
body: makebulk
}, function(err, resp) {
if (err) {
console.log(err);
} else {
callback(resp.items);
}
});
}
/*
Gets the specified URL, parses the JSON object,
extracts the needed data and indexes into the
specified Elasticsearch index
*/
http.get(APIUrl, function(res) {
var body = '';
res.on('data', function(chunk) {
body += chunk;
});
res.on('end', function() {
var APIURLResponse = JSON.parse(body);
makebulk(APIURLResponse, function(resp) {
console.log("Bulk content prepared");
indexall(resp, function(res) {
console.log(res);
});
console.log("Response: ", resp);
});
});
}).on('error', function(err) {
console.log("Got an error: ", err);
});
当我在网络服务器上运行node bulk_index.js
时,收到以下错误:TypeError: Bulk body should either be an Array of commands/string, or a String
。但是,这没有任何意义,因为console.log(res)
命令(来自indexall
客户端请求下的http.get
函数)输出以下内容:
Bulk content prepared
Response: [ { index: { _index: 'my_index', _type: 'my_type', _id: '1' } },
{ id: '5', name: 'The Name' }, ... },
... 120690 more items ]
上面的控制台输出似乎以正确的格式显示数组。
TypeError: Bulk body should either be an Array of commands/string, or a String
表示我传入client.bulk
函数的数组有什么问题?
我的服务器当前正在运行Elasticsearch 6.2.4
和Java Development Kit版本10.0.1
。一切都可以工作到Elaticsearch服务器甚至我的Elaticsearch映射(我没有提供client.indices.putMapping
代码,但是如果需要的话,我可以。)我花了几个小时阅读有关此TypeError的每一篇文档。关于错误被抛出,我找不到多少,所以我不确定在哪里可以查找有关此错误的信息。
答案 0 :(得分:2)
似乎代码中存在拼写错误。
var indexall = function(**madebulk**, callback) {
client.bulk({
maxRetries: 5,
index: "my_index",
type: "my_type",
body: **makebulk**
检查madebulk& makebulk。