13

我在使用Google的App引擎索引時遇到問題。當通過GoogleAppEngineLauncher運行我的應用時,該應用工作正常。當部署應用程序,我得到以下錯誤:Google App引擎錯誤:NeedIndexError:找不到匹配索引

NeedIndexError: no matching index found. 
The suggested index for this query is: 
- kind: Bar 
    ancestor: yes 
    properties: 
    - name: rating 
    direction: desc 

這行代碼後生成該錯誤:

bars = bar_query.fetch(10) 

上面的代碼行之前,有這麼一句話:

bar_query = Bar.query(ancestor=guestbook_key(guestbook_name)).order(-Bar.rating) 

我index.yaml中文件包含的具體 「建議」 下面#指數自動生成:

- kind: Bar 
    ancestor: yes 
    properties: 
    - name: rating 
    direction: desc 

我可能錯過了什麼嗎?我刪除了index.yaml文件並再次部署應用程序(通過命令行),並且少了一個文件被上傳 - 所以index.yaml文件就在那裏。

一切工作正常本地。我正在研究最新的Mac OSx。用於部署的命令是:

appcfg.py -A app-name --oauth2 update app 

我實施的數據存儲鬆散地基於留言板教程應用程序。

任何幫助將不勝感激。

編輯:

我ndb.Model定義如下:

class Bar(ndb.Model): 
    content = ndb.StringProperty(indexed=False) 
    lat = ndb.FloatProperty(indexed=False) 
    lon = ndb.FloatProperty(indexed=False) 
    rating = ndb.IntegerProperty(indexed=True) 
    url = ndb.TextProperty(indexed=False) 

回答

9

檢查https://appengine.google.com/datastore/indexes,看看這個指數存在和狀態設置爲 「服務」。該指數可能仍在建設中。

開發環境模擬生產環境。它在數據存儲意義上並不真正具有索引。

+0

嗨@Andrei,謝謝,我一直在那裏。它說:「你還沒有爲這個應用程序創建索引,有些類型的查詢需要建立索引,你可以在index.yaml文件中管理索引。」在其他論壇上我讀到,使用index.yaml時,它從不說「服務」。 – ISJ

+0

我在某處讀到以下內容:「您在datastore-index.xml中放入的索引是單個屬性索引,這意味着它由Datastore自動構建,並且不會顯示在控制檯中。」 – ISJ

+0

你是對的 - 單個屬性索引不必定義,它們不會顯示在索引頁上。我忘了問顯而易見:這是屬性索引? –

3

我通過移動index.yaml文件中自動生成行上面缺少錯誤的索引來解決此問題。

在你的情況下,YAML文件看起來像:

indexes: 
- kind: Bar 
ancestor: yes 
properties: 
- name: rating 
    direction: desc 

# AUTOGENERATED 

然後,所有你需要做的就是更新您的應用程序,然後更新索引,通過運行以下命令來更新索引。

appcfg.py [options] update_indexes <directory> 

該目錄是相對於您的index.yaml文件的目錄。然後,您應該在您的儀表板上看到該索引https://appengine.google.com/datastore/indexes

更新最初將處於「掛起」狀態,但在索引顯示「正在服務」後,您將能夠進行查詢。

+0

app.yaml需要與index.yaml位於同一文件夾中才能工作。如果index.yaml位於根文件夾中,命令行不喜歡它。如果app.yaml位於路徑文件夾中,SDK不喜歡它。解決方案:我不得不暫時將app.yaml和index.yaml放在config文件夾中。 –

10

現在可能有點晚了,但運行「gcloud app deploy index.yaml」幫助自運行部署本身忽略了index.yaml文件。

正如其他人所說,在https://appengine.google.com/datastore/indexes的儀表板將顯示「待定」一段時間。

+3

如果使用appcfg.py或appcfg.sh命令將應用程序部署到App Engine,則會自動部署索引配置文件。如果您使用gcloud app deploy命令部署應用程序,則索引配置文件不會自動部署。您必須明確列出index.yaml作爲gcloud應用程序部署的參數,或者運行gcloud數據存儲區create-indexes以部署索引配置文件。 – afed

2

我偶然發現了同樣的問題,您的意見幫助我朝着正確的方向發展。下面是谷歌說,如何處理這個問題:

按照谷歌文檔的故事是,使用

gcloud app deploy 

的index.yaml中的文件沒有上傳(問題是,爲什麼不呢?)。無論如何,人們必須手動上傳這個索引文件。

要做到這一點,該文檔提供了以下命令:

gcloud datastore create-indexes index.yaml 

(假設您從index.yaml中文件的同一目錄執行此) 一旦你做到了這一點,你可以去到數據存儲控制檯,你會看到索引已經創建。然後它會開始被編入索引(在我的情況下花費大約5分鐘),一旦索引被提供,您就可以開始申請。