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 № 1The 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ć.