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分钟),一旦索引被提供,您就可以开始申请。