节点Elasticsearch批量索引静默失败

时间:2019-02-20 08:08:11

标签: node.js elasticsearch

使用Nodejs客户端与Elasticsearch配合使用

  • Elasticsearch 6.6
  • 节点Elasticsearch客户端15.4.1

我正在尝试使用此功能批量索引一堆条目:

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()。

1 个答案:

答案 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