我正在研究如何为Google Datastore构建索引以执行以下查询:
SELECT * FROM Place WHERE type ='something'AND geohashes> ='XXX'AND geohashes< ='YYY'
我创建了以下索引。但是,当我执行该查询时,我收到一条错误消息:“找不到匹配的索引”
<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes
autoGenerate="true">
<datastore-index kind="Place" ancestor="false">
<property name="geohashes" direction="asc" />
<property name="geohashes" direction="desc" />
<property name="type" direction="asc" />
</datastore-index>
<datastore-index kind="Place" ancestor="false">
<property name="geohashes" direction="asc" />
<property name="type" direction="asc"/>
</datastore-index>
<datastore-index kind="Place" ancestor="false">
<property name="geohashes" direction="desc" />
<property name="type" direction="asc" />
</datastore-index>
</datastore-indexes>
如何在数据存储区中构建索引以便我可以执行上述查询?谢谢!
答案 0 :(得分:1)
使用数据存储运行查询时,必须提供非常具体的索引。这很重要,因为它允许数据存储区保证所有查询都按照结果集的大小进行扩展,不您的数据集。
通常,我建议首先使用本地开发服务器运行代码。这将为您的查询生成适当的索引。您可以使用以下命令run the server:
appengine-java-sdk/bin/dev_appserver.sh <war-location>
运行数据存储区查询时,将在您的apps目录中生成文件datastore-indexes-auto.xml
。这将包含您执行的任何查询的必要索引。
对于您的特定查询,您的索引属性不正常。
索引表的行首先按祖先排序,然后按属性值排序,按索引定义中指定的顺序排序。
对于您的特定查询,您需要索引:
<datastore-index kind="Place" ancestor="false">
<property name="type" direction="asc"/>
<property name="geohashes" direction="asc" />
</datastore-index>