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

Posted

技术标签:

【中文标题】Google App Engine 错误:NeedIndexError:找不到匹配的索引【英文标题】:Google App Engine error: NeedIndexError: no matching index found 【发布时间】:2015-06-30 16:20:04 【问题描述】:

我在使用 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 文件包含 # 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)

【问题讨论】:

【参考方案1】:

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

开发环境模拟生产环境。它实际上没有数据存储意义上的索引。

【讨论】:

嗨@Andrei,谢谢,我去过那里。它说:“您尚未为此应用程序创建索引。某些类型的查询需要构建索引。您可以在 index.yaml 文件中管理索引。”在其他论坛上,我读到使用 index.yaml 时它从不说“服务”。 我在某处读到以下内容:“您放入 datastore-index.xml 的索引是单个属性索引。这意味着它是由 Datastore 自动构建的,不会显示在您的控制台。” 您是对的 - 不必定义单个属性索引,它们不会显示在索引页面上。我忘了问一个显而易见的问题:这个属性是否被索引? 嗨@Andrei 感谢您的回复。是的,它是: rating = ndb.IntegerProperty(indexed=True) 我认为它需要一个自定义索引,因为它是一个具有降序排序的祖先查询。在这种情况下,该索引将出现在索引页面上。 index.yaml 中存在但索引页面上没有的索引定义的唯一解释是,您正在以某种方式查看两个不同的应用程序。真奇怪。【参考方案2】:

现在可能有点晚了,但运行“gcloud app deploy index.yaml”会有所帮助,因为运行 deploy 本身会忽略 index.yaml 文件。

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

【讨论】:

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

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

根据 Google 文档,故事是使用

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 文件夹中。【参考方案5】:

这个NeedIndexError 可能由不同的原因触发,因为我来到这里时遇到了一个稍微不同的问题,所以我将尝试解释我做错的所有事情,以展示可以做的事情:

我以为每种实体只能有一个索引。这不是真的,只要我found 你需要有尽可能多的索引作为你需要进行的不同查询

development web server 上自动生成索引并放置在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 来清理未使用的索引,请注意不要删除生产环境中使用的索引。参考here

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

我认为的事情,但我没有 100% 的证据超过我的特定问题,但我认为可以作为一种头脑风暴提供帮助:

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

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

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

【讨论】:

【参考方案6】:

就我而言,我已经手动上传了索引文件,如下所示:

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

【讨论】:

以上是关于Google App Engine 错误:NeedIndexError:找不到匹配的索引的主要内容,如果未能解决你的问题,请参考以下文章

google-app-engine部署错误

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

Google App Engine 中的 Django 模板语法错误

Google App Engine 导入 NLTK 错误

将应用程序部署到Google App Engine时出现超时错误

在 Google App Engine 上放置自定义错误页面的位置