一旦索引被删除并重新创建,Elasticsearch就不会自动提取现有的mongoDB数据

时间:2012-09-27 22:06:48

标签: mongodb elasticsearch

抱歉,如果我问过一个愚蠢的问题,但我无法弄明白 解。 我有数据存储在mongodb中,集合映射到es 索引使用richardwilly的插件。但是,我的几个指数 搞砸了(因为我不希望看到的所有数据都是如此) 在es(它仍然在mongodb))。我尝试在虚拟上创建虚拟索引 数据,我希望在重新索引后,我现在将看到这些数据 ES。

问题似乎是mongo河在oplog和 删除索引后,插入下一个第一个新文档 我想在mongodb中看到其他数千个文件 现在自动显示在es。但是,我只看到文件 我删除并重新创建索引后插入的。另一个 仍然可以在mongo中看到1000个文档但不在es。

我做了一个小实验,我看到如果我真的重新插入了 500个文档,然后在elasticsearch中可见(如果索引是 允许他们全部进入的权利)。你能告诉我怎样才能做到 我重新创建索引后,mongodb中的数据在es中可见 必须删除并重新插入,因为我不能这样做。我需要重播吗? oplog还是有其他方法,你可以这样建议 我可以将这些数据导入es而不删除并重新插入吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

正如你所说,MongoDB的工作原理是使用Mongo的oplog,这意味着你只能将文档的更改索引到Elastic中。 (对Mongo索引的更改与oplog无关)为了索引在第一个oplog条目之前创建的文档,您需要找到另一种方法。

如果您不想删除+重新插入,则可以对现有文档执行批量更新。

或者,您可以实现一个工具,在Elastic中查找第一个文档,查询Mongo以查找任何早期文档并索引缺少的文档。

答案 1 :(得分:0)

回答我自己的问题,我得到了弹性搜索社区的帮助。如果删除河流并创建新河流,则映射到的集合中的所有数据都应该在elasticsearch索引中可用。

答案 2 :(得分:0)

如果重新创建河流不起作用,有几种选择。

  1. 配置并启动副本集后,使用mongodump / mongorestore重新装入数据库。因为河流使用oplog,所以当您创建河流时,如果新河流将知道数据存在且应该被编入索引,则数据需要通过oplog传递。 (在开发环境中这可能更容易。)

  2. 另一种可能的方式是通过rails控制台触摸所有对象。同样,请确保您的副本集已在运行:

    $ bundle exec rails c
    1.9.1 :001 > Person.all.each do |person|
    1.9.1 :002 >     person.save()
    1.9.1 :003?>   end