找不到匹配的索引 - GAE

时间:2018-06-13 15:09:40

标签: java google-app-engine google-cloud-firestore google-cloud-endpoints-v2

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

@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没有自动更新。但是,Google doc说明了这一点(https://cloud.google.com/appengine/docs/standard/python/config/indexconfig):

  

应用程序发出的每个云数据存储区查询都需要一个   相应的指数。简单查询的索引,例如查询   单个属性是自动创建的。

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

如果我执行方法&#34; getMessagesByCity&#34;使用简单的查询:

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

后端使用此日志消息返回错误503:

  

&#34; com.google.appengine.api.datastore.DatastoreNeedIndexException:no   匹配索引找到。索引丢失但我们无法分辨   你是哪一个由于App Engine SDK中的一个错误。如果您的查询只   包含您最可能需要复合索引的相等过滤器   这些过滤器中引用的所有属性。&#34;

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

2 个答案:

答案 0 :(得分:0)

您需要上传索引配置,因此数据存储区将开始使用此命令通过自定义投影接受您的查询。

gcloud app deploy index.yaml

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

答案 1 :(得分:0)

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

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

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

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

或者确保你已经在你的本地运行了新的方法/函数,并确保index.yaml实际上确实改变了,如果你使用Git或者文件应该在本地之后弹出修改的东西服务器运行函数/方法。