将动态模板数组发布到ElasticSearch

时间:2018-04-09 13:06:30

标签: node.js elasticsearch elasticsearch-5

我想将动态对象数组发布到弹性搜索中。如果我发布单个对象,所有字段都可以正确显示,但如果我使用数组,我只会看到一个字段为字符串的字段。

```
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时建议如何处理数组?

1 个答案:

答案 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 severityfields添加到数组中的每个元素。

或者,如果您希望在文档中存储数组并直接从该数组中查找值,只需插入一个文档

{
    '@timestamp': '2018-04-09T12:17:17.645Z',
    message: 'logmessage1',
    severity: 'info',
    fields: {
      temp:
        {
          values: [
            testKey: 'testValue';
           ]
        }
    }
  }

可以通过temp.values[0].testKey

访问

但是我不确定它是如何编入索引的...通常每个密钥都会放在一个单独的文档中。