【发布时间】:2014-01-08 23:13:33
【问题描述】:
我的模型中有许多属性我目前不需要索引,但可以想象我可能希望在未来某个未知时间点进行索引。如果我现在为某个属性显式设置indexed=False 但以后改变主意,Datastore 会在那时自动重建整个索引,包括以前写入的数据吗?采用这种方法是否有其他影响?
【问题讨论】:
标签: google-app-engine indexing google-cloud-datastore
我的模型中有许多属性我目前不需要索引,但可以想象我可能希望在未来某个未知时间点进行索引。如果我现在为某个属性显式设置indexed=False 但以后改变主意,Datastore 会在那时自动重建整个索引,包括以前写入的数据吗?采用这种方法是否有其他影响?
【问题讨论】:
标签: google-app-engine indexing google-cloud-datastore
不,将 indexed=True 更改为 indexed=False(反之亦然)只会影响在此之后写入数据存储的实体。 Here is the documentation 谈论它和相关段落:
同样,将属性从索引更改为未索引只会影响随后写入数据存储区的实体。具有该属性的任何现有实体的索引条目将继续存在,直到实体被更新或删除。为避免不需要的结果,您必须清除所有按(现在未编制索引的)属性过滤或排序的查询的代码。
如果您稍后决定要开始索引属性,则必须检查您的实体并将它们重新放入数据存储区。
但是,请注意,将属性从未索引更改为已索引不会影响更改之前可能已创建的任何现有实体。对属性进行过滤的查询不会返回此类现有实体,因为实体在创建时并未写入查询的索引。要使以后的查询可以访问实体,您必须将它们重写到数据存储区,以便将它们输入到适当的索引中。也就是说,您必须对每个此类现有实体执行以下操作:
从数据存储中检索(获取)实体。
将实体写回(放置)回数据存储区。
【讨论】:
索引现有实体的属性(根据文档):
- 从数据存储区检索(获取)实体。
- 将实体写回(放置)回数据存储区。
对我不起作用。我使用了appengine-mapreduce 库并使用DatastoreMutationPool 编写了一个MapOnlyMapper<Entity, Void>,用于索引Datastore 中的所有现有实体。
让我们假设属性name 未编入索引,我想在所有现有实体中编入索引。我必须做的是:
@Override
public void map(Entity value) {
String property = "name";
Object existingValue = value.getProperty(property);
value.setIndexedProperty(property, existingValue);
datastoreMutationPool.put(value);
}
基本上,您必须使用setIndexedProperty(prop, value) 将属性设置为索引属性,然后保存(放置)实体。
我知道我发布答案很晚。我想我可以帮助那些可能正在努力解决这个问题的人。
【讨论】: