Google App Engine错误:NeedIndexError:找不到匹配的索引

时间:2015-04-22 19:35:37

标签: python-2.7 google-app-engine app-engine-ndb google-cloud-datastore

我在使用Google的App引擎索引时出现问题。通过GoogleAppEngineLauncher运行我的应用程序时,该应用程序运行正常。部署应用程序时,出现以下错误:

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文件包含确切的"建议"下面的索引#AUTOGENERATED:

- 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)

6 个答案:

答案 0 :(得分:14)

检查https://appengine.google.com/datastore/indexes以查看此索引是否存在且状态是否设置为“正在投放”。索引可能仍在构建中。

开发环境模拟生产环境。它确实没有数据存储区中的索引。

答案 1 :(得分:14)

现在可能有点晚了,但正在运行" gcloud app deploy index.yaml"帮助,因为运行部署本身忽略了index.yaml文件。

正如其他人所说,https://appengine.google.com/datastore/indexes上的信息中心将显示"待定"一段时间。

答案 2 :(得分:6)

我偶然发现了同样的问题,你的评论帮助我朝着正确的方向前进。以下是谷歌如何处理这个问题:

根据Google文档,故事是使用

gcloud app deploy 

未上传index.yaml文件(问题是为什么不上传?)。无论如何,必须手动上传这个索引文件。

为此,文档提供以下命令:

gcloud datastore create-indexes index.yaml

(假设您从index.yaml文件的同一目录执行此操作) 完成此操作后,您可以转到数据存储区控制台,您将看到已创建索引。然后它将开始编入索引(在我的情况下花了大约5分钟),一旦提供索引,您就可以开始申请了。

答案 3 :(得分: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

的信息中心上看到该索引

此更新最初将处于“待处理”状态,但在索引显示“正在投放”后,您将可以进行查询。

答案 4 :(得分:1)

这个NeedIndexError可能是由不同的原因触发的,因为我来到这里时遇到的问题略有不同,因此,我将尽力解释我做错的所有事情,以便展示可以做到的事情:< / p>

  • 我认为每种实体只能有一个索引。事实并非如此,只要我found 您需要拥有与将要进行的其他查询一样多的索引

  • development web server上,索引是自动生成的,并位于#AUTOGENERATED文件中的index.yaml行下方。

  • 修改索引后,我首先使用gcloud datastore indexes create index.yaml,然后等待,直到索引位于Serving中的https://console.cloud.google.com/datastore/indexes?project=your-project

  • 我通过执行gcloud datastore indexes cleanup index.yaml来清理未使用的索引,请注意,您不会删除生产中正在使用的索引。参考here

  • 请注意,如果您未在索引属性中指定direction,则默认情况下它将为ASC。因此,如果您尝试进行-排序查询,它将再次引起错误。

我认为,但我没有100%的证据比我的特定问题更长的时间,但我认为可以作为一种头脑风暴

  • 在查询数据时(而不是在上传时)索引很重要。

  • 如果手动生成索引,则似乎不需要手动创建#AUTOGENERATED行。参考here

  • 当开发服务器在进行查询时更新#AUTOGENERATED行下的索引时,您可以通过添加此通道来“意外地”解决您的问题。真正的问题是缺少使用gcloud datastore indexes create index.yaml命令的手动索引更新。参考herehere

答案 5 :(得分:0)

对于我来说,我手动上传了索引文件,如下所示:

gcloud datastore indexes create "C:\Path\of\your\project\index.yaml"

然后您应该确认更新:

Configurations to update:

descriptor:      [C:\Path\of\your\project\index.yaml]
type:            [datastore indexes]
target project:  [project_name]


Do you want to continue (Y/n)?  y

然后,您可以转到数据存储区控制台,以检查是否通过以下链接创建了索引: https://console.cloud.google.com/datastore/indexes