1

抱歉,如果我问了一个愚蠢的问题,但我无法找出解决方案。我将数据存储在 mongodb 中,并且使用 richardwilly 的插件将集合映射到 es 索引。但是,我的一些索引搞砸了(由于不是我期望看到的所有数据都在 es 中(它仍在 mongodb 中))。我尝试在虚拟数据上创建一个虚拟索引,我希望在重新索引后,我现在可以在 es 中看到这些数据。

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

我做了一个小实验,发现如果我真的重新插入了 500 个文档,它们就会在 elasticsearch 中可见(如果索引正确允许它们全部插入)。您能否告诉我,在我重新创建索引后,如何使 mongodb 中的数据在 es 中可见,而无需删除并重新插入,因为我不能这样做。我是否需要重播 oplog 或者是否有另一种方法可以建议,这样我就可以将这些数据放入 es 而无需删除和重新插入?

谢谢!

4

3 回答 3

2

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

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

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

于 2012-10-01T06:53:03.577 回答
0

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

于 2012-10-01T21:09:54.823 回答
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
    
于 2012-12-10T23:38:02.557 回答