我正在尝试查询数据存储区,我的查询如下所示:
SELECT *
FROM mydb
WHERE Latitude = "18.1" AND Number > "1"
它虽然不起作用 . 我在数据存储区查询框中收到此错误:
GQL查询错误:您的数据存储区没有此查询所需的复合索引(开发人员提供) .
运行我的代码时出现此错误:
找不到匹配的索引 . 推荐索引是:\ n-种类:mydb \ n属性:\ n - 名称:位置\ n - 名称:数字\ n
像这样的简单请求工作:
SELECT *
FROM mydb
WHERE Number > "1" AND Number < "5"
我这里只访问一个列可能这就是为什么?
不,
然后我尝试了这样的请求:
SELECT *
FROM mydb
WHERE Latitude = "18.1" AND Number = "1"
这很有效 .
我试图找到一个解决方案,我遇到了这个页面:https://cloud.google.com/datastore/docs/tools/indexconfig#Datastore_About_index_yaml
经过那个页面后,我收集到我需要一个index.yaml文件 . 它应该放在一个名为WEB-INF的文件夹中 . 但我没有这个文件夹 .
这是我的代码的一小部分:
Query<Entity> query = Query
.gqlQueryBuilder(Query.ResultType.ENTITY,
"SELECT * FROM " + kind + " WHERE Location = @location AND Number <= @number")
.setBinding("number", "5").setBinding("location", "18.1").build();
QueryResults<Entity> results = datastore.run(query);
1 回答
您得到的错误是因为您正在尝试的查询需要Composite indexes,默认情况下不可用 . 它们必须在
index.yaml
中指定 .文章Creating index files与发布的文章略有不同,专门针对在灵活环境中运行的Java应用程序 .
有两种方法可以创建
index.yaml
:按照Index definitions中规定的规则和结构手动使用您喜欢的文本编辑器 .
在本地测试时生成文件 . 这可以使用
gcloud beta emulators datastore start
命令完成 . 您还可以使用--data-dir <dir>
选项指定应在何处编写生成的index.yaml
.然后,一旦你有
index.yaml
和app.yaml
相同的目录,就可以从该目录中使用gcloud preview app deploy index.yaml
进行部署 . 此过程简要记录在Deploying the index file中 .我还建议阅读Organizing yaml Configuration Files .