使用Nodejs客户端与Elasticsearch配合使用
我正在尝试使用此功能批量索引一堆条目:
const elasticsearch = require('elasticsearch');
const configuration = require('./configuration').elasticConfig;
const elastic = new elasticsearch.Client({
host: `${configuration.host}:${configuration.port}`
});
const elasticStore = async (inputArray) => {
try {
const insert = await elastic.bulk({body: inputArray});
console.log(insert)
} catch (e) {
logger.error('failed to insert events into elastic search', {e});
}
};
我正在以下inputArray上运行elasticStore:
[
{
"index": {
"_index": "test-2019.02.19"
}
},
{
"timestamp": "2019-02-19T02:34:43.526Z",
"data": {
"something": "something"
}
},
{
"index": {
"_index": "test-2019.02.19"
}
},
{
"timestamp": "2019-02-19T02:34:43.526Z",
"data": {
"something": "something"
}
}
]
该函数在插入时失败,但会以静默方式失败-它不会引发错误或类似的情况。
我正在查看文档,其示例如下:
client.bulk({
body: [
// action description
{ index: { _index: 'myindex', _type: 'mytype', _id: 1 } },
// the document to index
{ title: 'foo' }
]
})
即使在运行示例时,也是如此:
const insert = await elastic.bulk({body: [
// action description
{ index: { _index: 'sb-app-events-test', _type: 'mytype', _id: 1 } },
// the document to index
{ title: 'foo' }
]});
它也无声地失败。
我认为问题可能出在我用于正文的JSON对象数组中(尽管官方文档说应该可以正常工作),然后尝试将其转换为JSONLines,创建了由换行符分隔的字符串对象字符串字符,但失败的方式相同:
let parsedInput ='';
inputArray.forEach(obj => parsedInput += JSON.stringify(obj) + '\n')
const insert = await elastic.bulk({body: parsedInput});
这产生了以下字符串:
"{\"index\":{\"_index\":\"myindex\",\"_type\":\"mytype\"}}\n{\"title\":\"foo\"}\n{\"index\":{\"_index\":\"myindex\",\"_type\":\"mytype\"}}\n{\"title\":\"foo\"}\n"
我想念什么?
编辑:下面Duy的答案解决了我的问题-它在顶层和每个插入对象中都需要一个类型。由于某些原因,带有断点的Webstorm调试在这里无法正常工作,我必须使用console.log()。
答案 0 :(得分:1)
检查代码后,发现您忘记将type
传递给bulk
函数
# Modify const insert = await elastic.bulk({body: inputArray});
# Become
const insert = await elastic.bulk({ body: inputArray, type: 'mytype'});
经过https://gist.github.com/duynguyenhoang/b05c1c6342f639e440422256c68fd040测试,效果很好
注意:Node.js v8.11.1