Elasticsearch js Bulk Index TypeError

时间:2018-05-04 18:25:23

标签: json node.js elasticsearch bulk-load

背景

最近,我一直在使用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的每一篇文档。关于错误被抛出,我找不到多少,所以我不确定在哪里可以查找有关此错误的信息。

1 个答案:

答案 0 :(得分:2)

似乎代码中存在拼写错误。

var indexall = function(**madebulk**, callback) {
    client.bulk({
        maxRetries: 5,
        index: "my_index",
        type: "my_type",
        body: **makebulk**

检查madebulk& makebulk。