我的模型中有许多属性,我目前不需要索引,但是可以想象,我可能希望在将来的某个未知点进行索引。如果我现在显式地为一个属性设置indexed=False,但在将来改变主意,那么Datastore会在那个时候自动重建整个索引,包括以前编写的数据吗?采取这种做法还有什么其他影响吗?
发布于 2014-01-08 23:22:05
否,将indexed=True更改为indexed=False (反之亦然)只会影响在此之后写入到数据存储的实体。关于它和相关段落的这是文件:
类似地,将属性从索引更改为非索引只会影响随后写入数据存储的实体。任何具有该属性的现有实体的索引条目将继续存在,直到更新或删除这些实体为止。若要避免不必要的结果,必须清除代码中的所有按(现在取消索引的)属性进行筛选或排序的查询。
如果稍后决定要开始索引属性,则必须遍历实体并将它们重新放到数据存储中。
但是,请注意,将属性从未索引更改为索引并不会影响更改之前创建的任何现有实体。对属性进行筛选的查询不会返回这样的现有实体,因为实体在创建时没有写入查询的索引。要使将来的查询能够访问这些实体,必须将它们重写到Datastore,以便在适当的索引中输入它们。也就是说,您必须对每个这样的现有实体执行以下操作: 从数据存储检索(获取)实体。 将实体写回Datastore。
发布于 2017-07-14 03:36:50
索引现有实体的属性(如文档所示):
对我不起作用。我使用了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)将属性设置为索引属性,然后保存(put)实体。
我知道我很晚才发了答案。我想我可以帮助那些可能在这个问题上挣扎的人。
https://stackoverflow.com/questions/21008580
复制相似问题