如何为elasticsearch生成随机记录

时间:2018-03-22 10:07:23

标签: javascript node.js elasticsearch

如何为elasticsearch生成记录?我想生成至少100万条记录来测试内存大小。

const now = new Date()
const startOfDay = new Date(now.getFullYear(), now.getMonth(), Math.random(now.getDate()))
const timestamp = startOfDay / 1000

const randomRecords = Array(10000000).fill(timestamp)

randomRecords.forEach((record, i) => {

    clientTest.index({
        index: 'test',
        type: 'test',
        id: '1',
        body: {
            [record]: `${record}${i}`,
        },
    }).then(function (resp) {
        logger.silly('Pushing of data completed', resp)

        return resp
    }, function (err) {
        console.trace(err.message)
    })

})

3 个答案:

答案 0 :(得分:1)

对于数组中的每条记录,您需要设置id=1。这意味着,对于每次迭代,您都会覆盖id = 1的记录,最后保存一条记录。

所以,你有两个解决方案:

  • 使用一个计数器,每次迭代都会增加,而不是数字1,或
  • 使用bulk API,这也提高了索引操作的性能。 注意您还应该为每条记录使用自动增量(或至少唯一)ID。

如果您还有其他问题,请告诉我。

答案 1 :(得分:0)

使用时应使用迭代器i来增加id字段。如果在索引时在elasticsearch中使用相同的id,则每次都会覆盖该字段。

变化:

id: '1',

id: i,

这应该可行,但我建议使用bulk api。因此,而不是每次迭代索引。因此,请在交付之前进行批量索引收集,然后在一个请求中对其进行批量索引。

Bulk API

答案 2 :(得分:0)

实际上,它对我也有用。

   export const pushTest = (message, type) => new Promise(async resolve => {
        try {
            let client = createClient()

            await client.index({
                index: type.toLowerCase(),
                type,
                body: message,
            },
            (error, response) => {
                logger.silly('Pushing of data completed', response)

                resolve(response)
            })
        } catch (e) {
            logger.error(e)
        }
    })

    for (let index = 0; index < 100; index++) {

        let messageTest = {
            'timestamp': {seconds: timestamp, nanos: 467737400},
            type: randomItem(alarmTypes),
            location: `Room_${Math.floor(Math.random() * 100)}`,
            zone: `Zone_${Math.floor(Math.random() * 100)}`,
            personName: 'person name',
            personRoom: `Room_${Math.floor(Math.random() * 100)}`,
            pageSize: 10,
            cancelTimestamp: {seconds: timestamp, nanos: 467737400},
            cancelPerson: 'person name',
            cancelLocation: `Room_${Math.floor(Math.random() * 100)}`,
            responseTime: {seconds: Math.floor(Math.random() * 1000000), nanos: 321549100},
        }

        pushTest(messageTest, 'Call')
    }