我想将动态对象数组发布到弹性搜索中。如果我发布单个对象,所有字段都可以正确显示,但如果我使用数组,我只会看到一个字段为字符串的字段。
```
const elasticsearch = require('elasticsearch');
const client = new elasticsearch.Client();
const bodyMsg = [
{ index: { _index: 'logs-2018.04.09', _type: 'log', pipeline: null } },
{
'@timestamp': '2018-04-09T12:17:17.645Z',
message: 'logmessage1',
severity: 'info',
fields: {
temp:
{
testKey: 'testValue',
}
}
}];
client.bulk({
body: bodyMsg,
waitForActiveShards: this.waitForActiveShards,
timeout: '10ms',
// type: this.type
}).then((res) => {
if (res.errors && res.items) {
res.items.forEach((item) => {
if (item.index && item.index.error) {
console.error('Elasticsearch index error', item.index.error);
}
});
}
})
```
对于上面的代码,我确实将对象发布到elasticsearch作为fields.temp.testKey
,其值为testValue
。
但是,如果我在字段中使用数组,即
```
fields: {
temp:
[{
testKey: 'testValue'
}]
}
```
然后在ES上我看到键fields
的值temp[{ testKey: 'testValue' }]
,但我期望的是如下所示:
值fields.temp[0].testKey
的{{1}}和价值testValue1
的{{1}}等等。
我的动态模板是:
fields.temp[1].testKey
请在发布到ES时建议如何处理数组?
答案 0 :(得分:0)
每个文档都需要是数组的新元素
[indexDef, item1, item2, item3 ... itemx]
添加两个文件的一个例子是:
[
{ index: { _index: 'logs-2018.04.09', _type: 'log', pipeline: null } },
{
'@timestamp': '2018-04-09T12:17:17.645Z',
message: 'logmessage1',
severity: 'info',
fields: {
temp:
{
testKey: 'testValue',
}
}
},
{
'@timestamp': '2018-04-09T12:17:17.645Z',
message: 'logmessage2',
severity: 'info',
fields: {
temp:
{
testKey: 'testValue2',
}
}
}];
您需要将@timestamp
severity
和fields
添加到数组中的每个元素。
或者,如果您希望在文档中存储数组并直接从该数组中查找值,只需插入一个文档
{
'@timestamp': '2018-04-09T12:17:17.645Z',
message: 'logmessage1',
severity: 'info',
fields: {
temp:
{
values: [
testKey: 'testValue';
]
}
}
}
可以通过temp.values[0].testKey
但是我不确定它是如何编入索引的...通常每个密钥都会放在一个单独的文档中。