/ / Node Elasticsearch - Nie działa indeksowanie zbiorcze - Nagłówek Content-Type [application / x-ldjson] nie jest obsługiwany - json, node.js, flexiblesearch

Elasticsearch węzła - indeksowanie masowe nie działa - nagłówek Content-Type [application / x-ldjson] nie jest obsługiwany - json, node.js, elasticsearch

Będąc nowicjuszem w elastsearch, eksploruję go, integrując się z węzłem i próbując wykonać następujący przykład git online w systemie Windows.

https://github.com/sitepoint-editors/node-elasticsearch-tutorial

podczas próby zaimportowania danych 1000 elementów z data.json wykonanie „node index.js” kończy się niepowodzeniem z powodu następującego błędu.

Włączając śledzenie, widzę teraz następującą przyczynę z funkcji zbiorczej.

"error": "Content-Type header [application/x-ldjson] is not supported",
** "status": 406**

Widzę dziennik zmian z https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/changelog.html co mówi za

13.0.0 (24 kwietnia 2017 r.) Zbiorcze i inne interfejsy API, które wysyłają rozdzielane wierszami treści JSON, teraz używają nagłówka Content-Type: application / x-ndjson # 507

Masz pomysł, jak rozwiązać ten problem z typem zawartości w index.js?

index.js

 (function () {
"use strict";

const fs = require("fs");
const elasticsearch = require("elasticsearch");
const esClient = new elasticsearch.Client({
host: "localhost:9200",
log: "error"
});

const bulkIndex = function bulkIndex(index, type, data) {
let bulkBody = [];

data.forEach(item => {
bulkBody.push({
index: {
_index: index,
_type: type,
_id: item.id
}
});
bulkBody.push(item);
});

esClient.bulk({body: bulkBody})
.then(response => {
console.log(`Inside bulk3...`);
let errorCount = 0;
response.items.forEach(item => {
if (item.index && item.index.error) {
console.log(++errorCount, item.index.error);
}
});
console.log(`Successfully indexed ${data.length - errorCount} out of ${data.length} items`);
})
.catch(console.err);
};

// only for testing purposes
// all calls should be initiated through the module
const test = function test() {
const articlesRaw = fs.readFileSync("data.json");
const articles = JSON.parse(articlesRaw);
console.log(`${articles.length} items parsed from data file`);
bulkIndex("library", "article", articles);
};

test();

module.exports = {
bulkIndex
};
} ());

moje lokalne środowisko Windows:

wersja java 1.8.0_121
Wersja Flexiblesearch 6.1.1
wersja węzła v8.9.4
Wersja npm 5.6.0

Odpowiedzi:

1 dla odpowiedzi № 1

The bulk function nie zwraca obietnicy. Przyjmuje funkcję zwrotną jako parametr.

esClient.bulk(
{body: bulkBody},
function(err, response) {
if (err) { console.err(err); return; }
console.log(`Inside bulk3...`);
let errorCount = 0;
response.items.forEach(item => {
if (item.index && item.index.error) {
console.log(++errorCount, item.index.error);
}
});
console.log(`Successfully indexed ${data.length - errorCount} out of ${data.length} items`);
}
)

albo użyj promisify aby przekonwertować funkcję akceptującą plik (err, value) => ... style callback do funkcji, która zwraca obietnicę.

const esClientBulk = util.promisify(esClient.bulk)
esClientBulk({body: bulkBody})
.then(...)
.catch(...)

EDYTOWAĆ: Właśnie dowiedziałem się, że elastyczne wyszukiwanie-js obsługuje oba oddzwonienia i obietnice. Więc to nie powinno być problemem.

Patrząc na package.json projektu, z którym łączysz się, używa elasticsearch-js wersja ^11.0.1 który jest starą wersją i wysyła żądania z application/x-ldjson nagłówek przesyłania zbiorczego, czyli niewspierany przez nowsze wersje Flexiblesearch. A więc aktualizacja elasticsearch-js do nowszej wersji (aktualna najnowsza to 14.0.0) powinien to naprawić.