1

是否有人知道可用于重新索引所有/某些名称空间中的所有/某些实体的库或好的代码示例?

如果我自己实现这个,我应该考虑 MapReduce 吗?

“我需要重新索引吗?” 感觉就像许多开发人员遇到的问题,但我能找到的最接近的是这个,这可能是一个好的开始?

其他选项是使用迭代数据存储名称空间和实体的任务队列的自制解决方案,但我不希望重新发明轮子并寻求一个强大的、经过验证的解决方案。

有什么选择 ?

4

1 回答 1

2

恐怕我不知道任何预建系统。我认为您基本上需要创建一个游标来遍历所有实体,然后对所有实体执行 get 和 put(或者在执行 put 之前选择检查它们是否在索引中 - 如果您有一些不会不需要更新,这会以读取和/或小型操作为代价为您节省写入)。

按照此处的示例: https ://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify#Cursors

  1. 创建一个 java.util.concurrent.SynchronousQueue 来保存成批的数据存储键。
  2. 使用 ThreadManager 创建 10 个新的消费者线程(当前限制): https ://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/ThreadManager 这些线程应该执行以下操作:
    1. 创建一个新的 objectify 实例并关闭 objectify 的 session 缓存和 memcache。
    2. 从 SynchronousQueue 中获取一批密钥。
    3. 使用批处理获取所有这些实体。
    4. 可以选择使用相关属性对所有这些实体进行仅键查询。
    5. 放置所有这些实体(或排除上面返回的实体)
    6. 从第 2 步开始重复。
  3. 在一个循环中,使用仅键游标查询获取接下来的 30 个键并将它们放入 SynchronousQueue。
  4. 将所有项目放入 SynchronousQueue 后,设置一个属性以在所有消费者线程完成工作后停止它们。
于 2013-03-13T12:45:35.940 回答