elasticsearch重新索引丢失了一些记录

olhwl3o2  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(552)

我有一个每周一次的导入工作,它将所有记录从mongodb插入elasticsearch。
我现在做的是:
“主”索引中已存在记录
我将所有新记录插入“main temp”索引
我删除了“main”索引
我将“主温度”重新索引为“主温度”
我删除了“main temp”索引
我正在同一数据集上本地运行该操作。
我注意到新“main”索引中的记录数与导入到“main temp”索引的记录数不匹配。
这是我正在使用的代码

try {
        await client.indices.delete({index: "main"})
        Logger.info('Old Index Deleted')
        await client.indices.create({ index: 'main' })
        Logger.info('New Index Created')
        await client.reindex({
            waitForCompletion: true,
            refresh: true,
            body: {
              source: {
                index: 'main-temp'
              },
              dest: {
                index: 'main'
              }
            }
        })
        Logger.info('Temp Index Reindexed/Cloned')
        await client.indices.delete({index: "main-temp"})
        Logger.info('Temp Index Deleted')
    } catch(e) {
        Logger.error(e)
    }

我使用的是elastic search 6.8.9,所以不能使用clone api,因为它是7.x的一部分
检查下面的结果截图,事情是每当它重新索引的记录数是不同的(通常小几千)
https://i.stack.imgur.com/g1u0j.png
更新:这里是我从reindex得到的响应(如果我让result=await)
有时它得到正确的数字,有时不是。

took: 22357,
timed_out: false,
total: 673637,
updated: 0,
created: 673637,
deleted: 0,
batches: 674,
version_conflicts: 0,
noops: 0,
retries: { bulk: 0, search: 0 },
throttled_millis: 0,
requests_per_second: -1,
throttled_until_millis: 0,
failures: []
bzzcjhmw

bzzcjhmw1#

我通过在创建/删除旧索引和重新编制索引之后引入超时来解决这个问题。
这是密码

try {
        await client.indices.delete({index: "main"})
        Logger.info('Old Index Deleted')
        await client.indices.create({ index: 'main' })
        Logger.info('New Index Created')
        await new Promise(resolve => setTimeout(resolve, 10000))
        await client.reindex({
            waitForCompletion: true,
            refresh: true,
            body: {
              source: {
                index: 'main-temp'
              },
              dest: {
                index: 'main'
              }
            }
        })
        await new Promise(resolve => setTimeout(resolve, 15000))
        Logger.info('Temp Index Reindexed/Cloned')
        await client.indices.delete({index: "main-temp"})
        Logger.info('Temp Index Deleted')
    } catch(e) {
        Logger.error(e)
    }

elasticsearch似乎需要一些时间才能让一切正常运行。

相关问题