3

У меня есть объекты в приложении двигатель, который я запрашиваю как:Missing индекс конкретных лиц в приложении двигателя

foo = Foo.all().filter('bar =', baz).get() 
#baz is unicode, bar is a StringProperty 
#Foo inherits from db.Model 

Это работает для большинства организаций, но при некотором значении Baz, ни один субъект не возвращается, даже несмотря на то, сущность, безусловно, существует, как можно проверить на https://console.cloud.google.com/datastore/entities/. Причина в том, что для этот конкретный объект нет индекса на его значение bar, о чем свидетельствует отсутствие галочки в столбце «Индексированный» на этой веб-странице.

docs состояния,

Индексов простых запросов, такие как запросы более одного свойства, которые создаются автоматически

Так что я ожидал бы, что всех объектов этого типа будет имеют индекс этого свойства, но, очевидно, это неверно. Вопросы:

Q1: при создании индекса добавляются ли сущности, которые были помещены до того, как первый запрос выполняется с использованием этого индекса? (или это индекс, созданный при первом размещении какого-либо объекта такого типа?)

Q2: если нет, то какие изменения в сущности (если таковые имеются) приведут к тому, что индекс будет добавлен к этому свойству? (я пытался изменить свойство, отличное от bar, и помещать, и это не вызывало добавление объекта)

Q3: явно листинг индекса в index.yaml изменить это поведение?

Q4: существует ли способ программно определить, имеет ли объект индекс для определенного свойства?

Q5: (бонус) есть ли документация Google по вышеуказанному?

благодаря

ответ

1

Что длина данных вы храните? Documentation говорит:

Короткие строки (до 1500 байт) индексируются и могут использоваться в условиях фильтра запросов и порядка сортировки.

Длинные строки (до 1 мегабайта) не индексируются и не могут использоваться в фильтрах запросов и порядке сортировки.

Дополнительная информация о создании индекса вообще here + его «связанные статьи».

+0

Для данного объекта, это 9 символов, utf-8. Я думаю, что это 18 байт. – tom

3

Q1) Индекс для отдельных свойств создается автоматически при создании первого объекта, обладающего этим свойством (с индексированным = истинным). Однако, независимо от того, добавлено ли свойство в индекс, это атрибут уровня объекта/свойства, который задается при его записи.

Q2) В каждом свойстве есть флаг, который сообщает серверу, если он должен индексировать свойство. Если вы читаете объект и записываете его обратно с флагом, установленным в true на bar, он будет вставлен в индекс ,

Q3) index.yaml предназначен только для составных индексов (индексы с несколькими свойствами).Индивидуальные свойства управляются флагом уровня собственности при записи/обновлении объекта и не требуют предварительной настройки.

Q4) Только путем чтения каждого объекта и проверки флага индекса для рассматриваемого объекта.

Q5) Для составных индексов вы можете прочитать Datastore Indexes. Для индексов свойств прочитайте Entities, Properties, and Keys page в разделе «Типы свойств и значений» - вы увидите много индексов.

+0

спасибо. Поскольку я задал вопрос, я получил некоторую обратную связь от инженеров Google (по электронной почте) и провел множество экспериментов. Я считаю, что ваш ответ на Q4 не совсем корректен. AFAICT, флаг индекса указывает, следует ли индексировать свойство _should_ при его установке, а не в настоящее время оно находится в индексе. Например, если тип свойства ранее был TextProperty (который невозможен), некоторые объекты были помещены, а затем тип был изменен на String, свойство не было бы в индексе, но флаг «index» был бы «True». Правильно ли это звучит? Если да, то можете ли вы обновить свой ответ? – tom

+0

, чтобы определить, какие объекты находятся в индексе. Я выполнил запрос типа 'Foo.all(). Order ('bar')', чтобы определить, какие из них были в индексе, и на каждом из них присваивается True свойство, подобное 'has_index', True. Затем был запущен другой запрос типа 'Foo.all()', и для каждого объекта, где 'has_index' был None, я мог бы указать, что индекс отсутствует, и поэтому изменил значение' bar', а затем поместил. Это сработало, и я не мог найти другого способа сделать это. Поэтому, пожалуйста, можете ли вы либо использовать это в своем ответе, либо предоставить кодекс или псевдокод объяснение того, как это сделать, чтобы ответ был как можно более полезным? thxs – tom

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