3

我在應用程序引擎的實體,我查詢爲:缺失索引

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

這適用於大多數的實體,但巴茲的一些價值,沒有返回單位,即使實體當然存在,可以在https://console.cloud.google.com/datastore/entities/驗證,原因是對於,特定實體沒有索引值,它的值爲bar,正如該網頁的「索引」列中缺少複選標記所證明的那樣。

docs狀態

指標進行簡單的查詢,如在一個單一屬性查詢,自動創建

所以我本來預計該類型的所有實體將有該屬性的索引,但顯然這是不正確的。問題:

Q1:創建索引時,是否將其添加到第一次使用該索引運行查詢之前放置的實體? (或索引第一次創建該類型的任何實體被放?)

Q2:如果沒有,什麼樣的變化對實體(如果有的話)會導致被添加到該屬性的索引? (我試過更改酒吧以外的其他房產,並且沒有導致實體被添加)

Q3:會明確列出index.yaml中的索引更改此行爲嗎?

問題4:有沒有一種方法可以通過編程方式確定實體是否在特定屬性上有索引?

Q5 :(獎金)上面有沒有谷歌文檔?

謝謝

回答

1

什麼是你存儲的數據的長度? Documentation說:

短字符串(最多1500字節)被索引,可用於查詢過濾條件和排序順序。

長字符串(高達1兆字節)未編制索引,無法在查詢過濾器和排序順序中使用。

有關索引創建的更多信息here及其「相關文章」。

+0

對於這個特定的實體,它是9個字符,utf-8。我認爲這是18個字節。 – tom

3

Q1),用於個別屬性的索引如果編寫的具有屬性(與索引=真第一實體創建自動創建的)。但是,索引中是否添加了屬性是在編寫時設置的實體/屬性級別屬性。 Q2)每個屬性都有一個標誌,告訴後端它是否應該爲屬性編制索引。如果讀取實體並將其寫回到bar的標誌設置爲true,它將被插入到索引中。

Q3)index.yaml僅用於組合索引(多屬性索引)。當您編寫/更新實體時,各個屬性由屬性級別標誌控制,不需要預先配置。

Q4)只讀回每個實體並檢查相關屬性的索引標誌。

Q5)對於複合索引,您可以閱讀Datastore Indexes。對於房產指數,請在「財產和價值類型」部分閱讀Entities, Properties, and Keys page,您會在那裏看到很多關於指數的信息。

+0

謝謝。自問這個問題以來,我收到了谷歌工程師的一些反饋(通過電子郵件),並做了大量的實驗。我相信你對Q4的回答並不完全正確。 AFAICT,索引標誌標記屬性_should_是否被放入索引時,而不是當前是否在索引中。例如,如果屬性的類型先前是TextProperty(這是不可索引的),則放置一些實體,然後將類型更改爲字符串,該屬性不在索引中,但'索引'標誌爲'真'。這聽起來是對的嗎?如果是這樣,請你能更新你的答案嗎? – tom

+0

來確定哪些實體在索引中我運行了一個像Foo.all()。order('bar')'這樣的查詢來確定哪些實體在索引中,並且每一個都將'has_index'設置爲True。然後運行另一個查詢,比如'Foo.all()',並且對於has_index是None的每個實體,我可以推斷索引已經丟失,然後改變了'bar'的值,然後放入。它工作,我找不到任何其他方式來做到這一點。所以,請你可以將它用於你的答案,或者提供一個代碼或僞代碼解釋如何去做,這樣答案儘可能有用? thxs – tom