App Engine 数据存储区对您的应用程序进行的每个查询都将使用索引。每当实体更改时,这些索引将更新,以便在应用程序进行查询时快速返回结果。为此,数据存储区必须预先了解应用程序将进行哪些查询。可在配置文件中指定应用程序所需的查询。当您测试应用程序时,开发服务器可自动生成数据存储区索引配置。
可在名为 datastore-indexes.xml 的文件(位于您的应用程序 WAR 中 WEB-INF/ 目录下)中指定数据存储区索引配置。这是一个 XML 文件,其根元素为 <datastore-indexes>。它包含零个或多个 <datastore-index> 元素,分别对应 App Engine 应维护的每一个索引。
如查询和索引中所述,索引是指定类型实体的一组指定属性的值的表。每一列属性值都按升序或降序排列。索引配置可指定实体类型、属性的名称及其排序顺序。
以下是一个指定 2 个索引的示例:
<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes
xmlns="http://appengine.google.com/ns/datastore-indexes/1.0"
autoGenerate="true">
<datastore-index kind="Employee" ancestor="false">
<property name="lastName" direction="asc" />
<property name="hireDate" direction="desc" />
</datastore-index>
<datastore-index kind="Project" ancestor="false">
<property name="dueDate" direction="asc" />
</datastore-index>
</datastore-indexes>
<datastore-indexes> 元素具有 autoGenerate 属性,该属性控制是否应将此文件与自动生成的索引配置一同考虑。请参阅下面的使用自动索引配置
每个 <datastore-index> 元素表示一个索引。kind 属性指定要编入索引的实体类型。如果索引支持通过父实体组过滤实体的查询,则 ancestor 属性为 true,否则为 false。
<datastore-index> 中的 <property> 元素代表要编入索引的实体属性name 属性是属性名称,direction 属性是排序顺序(对于升序为 asc,对于降序为 desc)。属性元素的顺序将指定索引中的顺序:行首先按第一个属性排序,然后按第二个属性排序,以此类推。
手动确定应用程序查询所需的索引非常繁琐且易于出错。幸运的是,开发服务器可为您确定索引配置。要使用自动索引配置,请将 autoGenerate="true" 属性添加到 datastore-indexes.xml 文件的 <datastore-indexes> 元素中。如果您的应用程序没有 datastore-indexes.xml 文件,则也将使用自动索引配置。
启用自动索引配置后,开发服务器将在应用程序 WAR 中的 WEB-INF/appengine-generated/ 目录下维护一个名为 datastore-indexes-auto.xml 的文件。如果在开发服务器中运行的应用程序试图进行数据存储区查询,而该查询在 datastore-indexes.xml 和 datastore-indexes-auto.xml 中都没有对应的索引,则服务器将向 datastore-indexes-auto.xml 添加适当的配置。
如果在您上传应用程序时自动索引配置已启用,则 AppCfg 将使用 datastore-indexes.xml 和 datastore-indexes-auto.xml 来确定在 App Engine 上需要为应用程序构建的索引。
如果您的 datastore-indexes.xml 中出现 autoGenerate="false",则开发服务器和 AppCfg 将忽略 datastore-indexes-auto.xml 的内容。如果在开发服务器中运行的应用程序执行查询,而查询的索引未在 datastore-indexes.xml 中指定,则开发服务器将如同 App Engine 一样引发异常。
最好不定期地将索引配置从 datastore-indexes-auto.xml 移动到 datastore-indexes.xml 中,然后禁用自动索引配置并在开发服务器上测试您的应用程序。这样做使得不必管理两个文件即可轻松维护索引,并确保您的测试可重现因缺失索引配置而导致的错误。