未找到匹配索引 - GAE

Posted

技术标签:

【中文标题】未找到匹配索引 - GAE【英文标题】:no matching index found - GAE 【发布时间】:2018-11-23 05:39:20 【问题描述】:

我正在使用一些方法部署一个小后端。其中一个进行了简单的查询以检索对象列表。方法是这样的:

@ApiMethod(path = "getMessagesByCity", name = "getMessagesByCity", httpMethod = ApiMethod.HttpMethod.POST)
    public MessageResponse getMessagesByCity(@Named("City_id") Long city) 
        MessageResponse response = new MessageResponse();
        List<Message> message = ofy().load().type(Message.class).filter("city", city).list();
        response.response = 200;
        return response;
    

这是 Message 类:

@Entity
public class Message 
    @Id 
    private Long id;
    private String name;
    @Index
    private Long city;
    ...

我已经阅读了很多帖子,所有帖子都提到这可能是因为 datastore-indexes.xml 没有自动更新。然而,谷歌文档这样说(https://cloud.google.com/appengine/docs/standard/python/config/indexconfig):

应用程序进行的每个 Cloud Datastore 查询都需要一个 对应的索引。简单查询的索引,例如查询 单个属性,是自动创建的。

因此,我认为与索引相关的文件对我来说不是必需的。

如果我使用简单查询执行方法“getMessagesByCity”:

List<Message> message = ofy().load().type(Message.class).filter("city", city).list();

后端返回错误 503 并带有此日志消息:

"com.google.appengine.api.datastore.DatastoreNeedIndexException: 否 找到匹配索引。缺少索引,但我们无法判断 由于 App Engine SDK 中的错误,您是哪一个。如果您的查询仅 包含您最有可能需要复合索引的等式过滤器 这些过滤器中引用的所有属性。”

有什么想法吗?我该如何解决?

【问题讨论】:

【参考方案1】:

您需要上传索引配置,因此 Datastore 将开始接受您使用此命令自定义投影的查询。

gcloud app deploy index.yaml

有关数据存储区查询处理和索引的更多信息,请参阅 https://cloud.google.com/datastore/docs/concepts/indexes。

【讨论】:

但是,需要 index.yaml 吗?我已经创建了它,但它还没有工作=(但是,在 Firestore 面板中,会出现这样的消息:“在集合中的所有文档中找到的唯一字段会自动编入索引,以便能够对它们进行排序和执行简单的查询。”我的查询很简单,所以我知道我不应该创建任何关于索引的文件 您使用的是 Firestore 还是 Datastore? 我正在使用 Firestore。我尝试以手动方式创建索引,它也不起作用。 此答案中的链接与不同于 Firestore 的 Datastore 有关。 在主要问题中明确说明您使用的是 Firestore 而不是 Datastore。【参考方案2】:

每次您在代码中使用具有不同过滤器/顺序等的新数据存储查询时,您的 index.yaml 应该会自动更新,(可能需要在本地开发服务器中至少运行一次该逻辑以使其将新索引添加到文件中)

在本地开发中,第一次点击它时,它应该可以工作,但是在部署新索引时,它在生产/应用程序服务器上可用之前存在延迟时间。我们遇到过很多这样的问题,从谷歌控制台中,您可以通过转到相关项目的数据存储 > 索引 (https://console.cloud.google.com/datastore/indexes) 来实际查看它是否正在进行中。

如果所有索引都有绿色勾号并且问题仍然存在,那么这不是问题,并且可以进一步调试,但是如果某些索引旁边有微调器,这意味着该索引仍在制作中并且在完成之前无法使用。

如果这是您的问题,您可以通过首先通过 gcloud 部署 index.yaml 然后只部署您的应用程序来避免它。

或者,确保您已在本地运行新方法/函数,并确保 index.yaml 实际上已更改,如果您使用 Git 或其他文件,则该文件应在本地后弹出为已修改服务器运行函数/方法。

【讨论】:

非常感谢您的评论!在 localhost 中它工作正常......我可以进行查询并且没有任何错误,但是当我将后端部署到 App Engine 时,它​​仍然出现相同的 503 错误 index.yaml 是 100% 需要的,如果您的 index.yaml 中没有匹配的条目,则不会在 GAE 中对 Datestore 进行任何查询 index.yaml 应该自动生成,并且您永远不应该手动编辑它或删除它,无论你的查询多么简单,数据存储的基础都需要它。 它不像传统的数据库,其中索引是优化特定查找的可选事物,数据存储索引实际上是您的数据存储可以运行的唯一查询,以至于查询“表/ Collection" X where Y 10 的相同 "Table/Collection" X 的查询将在 index.yaml 中创建一个全新的条目,因此对于 1 “表/集合”您可能在 yaml 中有许多规则,因此 GAE 会根据您在代码中使用的内容自动生成。 另外可能很重要的一点是,GAE 上的数据存储部署的 VS 连接到您的本地数据存储“模拟器”确实有细微差别,没什么大不了的,我还没有测试过,但很有可能在您的本地,无论是否使用 index.yaml,您的查询都可以正常工作,并且只有在生产中您才会遇到您遇到的问题。 你是对的。从本地主机一切正常。我已经尝试使用@QuestionAndAnswer 指令(“gcloud app deploy index.yaml”),但它仍然无法正常工作。我不知道我可以尝试什么...

以上是关于未找到匹配索引 - GAE的主要内容,如果未能解决你的问题,请参考以下文章

Pandas Merge 中未捕获 Excel 中的“索引匹配”功能(或者是吗?)

数据存储区真的需要索引吗?

代码签名错误:未找到匹配的配置文件:未找到与适用的签名身份匹配的配置文件

如何找到已排序容器的匹配元素的索引?

如何有效地找到两个列表中匹配元素的索引

获取索引数组,在另一个数组中找到匹配的索引并替换值