2014-01-08 6 views
7

В моей модели есть много свойств, которые мне в настоящее время не нужны, но могут представить, что я могу захотеть проиндексировать в каком-то неизвестном месте в будущем. Если я прямо установил indexed=False для свойства сейчас, но изменил свое мнение по дороге, будет ли Datastore автоматически восстанавливать все индексы в этот момент, в том числе для ранее записанных данных? Есть ли какие-либо другие последствия для такого подхода?Ретроактивное индексирование в Google Cloud Datastore

ответ

11

Нет, изменение индексированного = Истинное индексирование = False (и наоборот) влияет только на сущности, записанные после этой точки на хранилище данных. Here is the documentation, что говорит об этом и соответствующем пункте:

Аналогичным образом, изменяя свойства от индексируются неиндексированным влияют только на объекты впоследствии записывается в хранилище. Записи индекса для любых существующих объектов с этим свойством будут продолжать существовать до тех пор, пока сущности не будут обновлены или удалены. Чтобы избежать нежелательных результатов, вы должны очистить свой код от всех запросов, которые фильтруют или сортируют по свойству (теперь неиндексированному).

Если вы решите позже, что хотите начать индексирование свойств, вам придется пройти через свои сущности и переложить их в хранилище данных.

Обратите внимание, однако, что изменение свойства без индексации на индексирование не влияет на существующие сущности, которые могли быть созданы до изменения. Фильтрация запросов по свойству не возвращает таких существующих объектов, поскольку сущности не были записаны в индекс запроса при их создании. Чтобы сделать сущности доступными для будущих запросов, вы должны переписать их в хранилище данных, чтобы они были введены в соответствующие индексы. То есть вы должны сделать следующее для каждого такого существующего объекта:

Получить (получить) сущность из хранилища данных.

Напишите (положите) объект обратно в хранилище данных.

0

Для индексных свойств существующих объектов (согласно документации):

  1. Retrieve (получить) предприятие с Datastore.
  2. Напишите (положите) объект обратно в хранилище данных.

не работал для меня. Я использовал библиотеку appengine-mapreduce и написал MapOnlyMapper<Entity, Void> с использованием DatastoreMutationPool для индексирования всех существующих объектов в хранилище данных.

Предположим, что свойство 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), а затем сохранить (поместить) объект.

Я знаю, что очень поздно выкладываю ответ. Я думал, что смогу помочь кому-то, кто может бороться с этой проблемой.

Смежные вопросы