谷歌应用引擎错误:NeedIndexError:未找到匹配的索引

20

我在使用Google的应用引擎索引时遇到了问题。当通过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文件包含下面生成的确切的“建议”索引#自动生成:

- 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个回答

17

请检查https://appengine.google.com/datastore/indexes以查看此索引是否存在,并确保状态设置为“服务中”。可能该索引仍在建造中。

开发环境模拟生产环境。它并没有真正的Datastore索引。


嗨@Andrei,谢谢,我已经看过了。它说:“您尚未为此应用程序创建索引。某些类型的查询需要构建索引。您可以在index.yaml文件中管理索引。”在其他论坛上,我读到当使用index.yaml时,它从来没有显示“正在提供”。 - ISJ
我在某个地方读到了以下内容:“您在datastore-index.xml中放置的索引是单属性索引。这意味着它会被Datastore自动构建,并不会显示在您的控制台上。” - ISJ
你是对的 - 单个属性索引不需要被定义,它们也不会显示在索引页面上。我忘记问一个显而易见的问题:这个属性是否被索引了? - Andrei Volgin
嗨@Andrei,感谢您的回复。是的,它是:rating = ndb.IntegerProperty(indexed = True) - ISJ
1
我认为它需要一个自定义索引,因为这是一个带有降序排序的祖先查询。在这种情况下,此索引将出现在索引页面上。索引.yaml中存在索引定义但不在索引页面上的唯一解释是您正在查看两个不同的应用程序。真的很奇怪。 - Andrei Volgin
谢谢 @Andrei,我用 appcfg.py --help 瞎搞了一下。我发现有一个名为 'update indexes' 的操作。现在控制台显示待定:D - ISJ

17

现在可能有点晚了,但运行"gcloud app deploy index.yaml"会有帮助,因为仅运行deploy命令会忽略index.yaml文件。

正如其他人所说,仪表板上的https://appengine.google.com/datastore/indexes将会显示“pending”,需要等待一段时间。


6
如果您使用appcfg.py或appcfg.sh命令将应用部署到App Engine,则索引配置文件将自动部署。如果您使用gcloud app deploy命令部署应用程序,则索引配置文件不会自动部署。您必须将index.yaml明确列为gcloud app deploy的参数之一,或者运行gcloud datastore create-indexes来部署索引配置文件。 - afed

7
我发现了同样的问题,你的评论帮助我找到了正确的方向。这是谷歌关于如何处理此问题的建议:
根据谷歌文档的说法,使用
gcloud app deploy 

索引(index).yaml文件没有上传(问题是为什么没有?)。无论如何,必须手动上传此索引文件。
要这样做,文档提供了以下命令:
gcloud datastore create-indexes index.yaml

假设您从index.yaml文件所在的相同目录执行此操作,

完成后,您可以转到Datastore控制台,您将看到索引已创建。然后它将开始被索引(在我的情况下需要约5分钟),一旦索引正在提供服务,您就可以启动应用程序。


4

我通过将"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上看到您的仪表板上的索引。

更新最初将为“待处理”,但在索引显示为“服务”之后,您将能够进行查询。


app.yaml需要与index.yaml放在同一个文件夹中才能正常工作。如果index.yaml在根文件夹中,命令行会不喜欢它。如果app.yaml在路由文件夹中,SDK也会不喜欢它。解决方案:我不得不暂时将app.yaml和index.yaml都放在config文件夹中。 - Yvonne Aburrow

1

这个NeedIndexError错误可能由不同的原因触发,我在这里遇到了一个略有不同的问题,所以我会尝试解释我所有的错误操作,以展示可能出现的问题:

  • 我曾经以为每个实体类型只需要一个索引。但事实并非如此,只要你发现你需要尽可能多的索引来满足不同的查询需求

  • 开发 Web 服务器上,索引会自动生成并放置在index.yaml文件的#AUTOGENERATED行以下。

  • 修改索引后,我使用首先使用gcloud datastore indexes create index.yaml命令,并等待索引在https://console.cloud.google.com/datastore/indexes?project=your-project中变为Serving状态。

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

  • 请注意,如果您没有在索引属性上指定direction,它将默认为ASC。因此,如果您试图进行-排序查询,它将再次引发错误。

以下是我认为可以作为一种头脑风暴的内容,虽然没有100%的证据支持我的特定问题,但我认为可以帮助:

  • 在查询数据时,索引非常重要,但在上传数据时并不重要。

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

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


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

然后您可以通过此链接访问Datastore控制台,检查索引是否已创建: https://console.cloud.google.com/datastore/indexes


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接