【问题标题】:Elasticsearch Reindex missing out some recordsElasticsearch Reindex 丢失了一些记录
【发布时间】:2020-12-14 05:21:40
【问题描述】:

我每周进行一次导入作业,它将所有记录从 MongoDB 插入到 ElasticSearch。
我正在做的事情如下:

  1. “主”索引中已存在记录
  2. 我将所有新记录插入到 'main-temp' 索引中
  3. 我删除了“主”索引
  4. 我将“main-temp”重新索引为“main”
  5. 我删除了 '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: []

【问题讨论】:

  • 当然,您确定 MongoDB 始终包含完全相同数量的记录?您从 reindex 调用中得到什么响应?
  • 是的,我确定。事情是,我没有刷新数据库,在我的本地测试中,我总是在读取同一个数据库。 (不变)
  • 我的第二个问题呢?
  • 如果我期望重新索引的结果,我得到这个错误:[“事件”参数需要是一个字符串。]。如果我不让结果 = 并且只等待,那么一切都很好。我在克隆索引上遇到了同样的错误。
  • 设置waitForCompletion: false,然后在开发工具中运行GET _tasks?actions=*reindex&detailed。你得到了什么?

标签: node.js elasticsearch


【解决方案1】:

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

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 似乎需要一些时间才能让一切正常运行。

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 2017-02-26
    相关资源
    最近更新 更多