如何使用权益过滤器为不等式过滤器配置Google数据存储区索引

时间:2015-11-08 08:19:41

标签: google-app-engine google-cloud-datastore

我正在研究如何为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>

如何在数据存储区中构建索引以便我可以执行上述查询?谢谢!

1 个答案:

答案 0 :(得分:1)

使用数据存储运行查询时,必须提供非常具体的索引。这很重要,因为它允许数据存储区保证所有查询都按照结果集的大小进行扩展,您的数据集。

通常,我建议首先使用本地开发服务器运行代码。这将为您的查询生成适当的索引。您可以使用以下命令run the server

appengine-java-sdk/bin/dev_appserver.sh <war-location>

运行数据存储区查询时,将在您的apps目录中生成文件datastore-indexes-auto.xml。这将包含您执行的任何查询的必要索引。

对于您的特定查询,您的索引属性不正常。

来自index documentation

  

索引表的行首先按祖先排序,然后按属性值排序,按索引定义中指定的顺序排序。

对于您的特定查询,您需要索引:

<datastore-index kind="Place" ancestor="false">
  <property name="type" direction="asc"/>
  <property name="geohashes" direction="asc" />  
</datastore-index>