Elasticsearch js Bulk Index TypeError - PullRequest
0 голосов
/ 04 мая 2018

Фон

Недавно я работал с Elasticsearch Node.js API для массового индексирования большого файла JSON. Я успешно проанализировал файл JSON. Теперь я должен быть в состоянии передать массив, готовый к индексу, в массовую команду Elasticsearch. Однако при использовании журнала консоли создается впечатление, что массив не должен вызывать каких-либо проблем.

Код ошибки

Следующий код должен взять URL-адрес API (с ответом JSON) и проанализировать его с помощью HTTP-библиотеки Node.js. Затем с помощью API Elasticsearch Node.js он должен массово индексировать каждую запись в массиве 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 голосов
/ 04 мая 2018

Кажется опечатка в вашем коде.

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

Проверьте сделанный и изготовленный товар.

...