設定 Datastore 索引

從 App Engine 存取的 Cloud Datastore 會對應用程式執行的每個查詢套用索引。只要實體有了變更,這些索引就會隨之更新,因此應用程式執行查詢時,能夠快速得到結果。如要這麼做,Cloud Datastore 必須事先知道應用程式將會執行哪些查詢,才能達到此目的。您必須利用設定檔來指定應用程式需要哪些索引。當您測試應用程式時,開發伺服器可自動產生 Cloud Datastore 索引設定。

建立 Cloud Datastore 索引

您可以在應用程式 war/ 目錄的 WEB-INF/datastore-indexes.xml 中指定 Cloud Datastore 索引的設定。

Datastore 索引頁面所述,索引是一個資料表,包含特定種類實體的一組特定屬性值。每個屬性值的欄將依照遞增或遞減順序排序。索引的設定將指定實體的種類、屬性名稱和排序順序。

以下範例說明可指定兩個索引的 datastore-indexes.xml

<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes
  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" />
        <property name="cost" direction="desc" />
    </datastore-index>
</datastore-indexes>

使用開發伺服器建立索引

手動決定應用程式查詢所需的索引是一件不僅單調乏味而且容易出錯的事情。不過,幸好有開發伺服器可以為您決定索引設定。如要使用自動索引設定,請將 autoGenerate="true" 屬性新增至 WEB-INF/datastore-indexes.xml 檔案的 <datastore-indexes> 元素。如果您的應用程式沒有 datastore-indexes.xml 檔案,則也會使用自動索引設定。

如果已啟用自動索引設定,開發伺服器會在應用程式的 war/ 目錄中維護名為 WEB-INF/appengine-generated/datastore-indexes-auto.xml 的檔案。如果在開發伺服器中執行的應用程式嘗試針對在 datastore-indexes.xmldatastore-indexes-auto.xml 中沒有對應索引的內容執行 Cloud Datastore 查詢,伺服器就會將適當的設定新增至 datastore-indexes-auto.xml 中。

如果您上傳應用程式時啟用了自動索引設定,AppCfg 就會使用 datastore-indexes.xmldatastore-indexes-auto.xml 來決定要為實際工作環境中的應用程式建構哪些索引。

如果 autoGenerate="false" 位於 datastore-indexes.xml 中,開發伺服器和 AppCfg 就會忽略 datastore-indexes-auto.xml 的內容。如果本機運作的應用程式執行的查詢並未在 datastore-indexes.xml 中指定索引,開發伺服器就會擲回例外狀況,就像實際工作環境的 Cloud Datastore 一樣。

建議您偶爾將索引設定從 datastore-indexes-auto.xml 移至 datastore-indexes.xml,然後停用自動索引設定並在開發伺服器上測試應用程式。如此一來,您不需要管理兩個檔案,即可輕鬆維護索引,還能確保您的測試重現因為遺失索引設定而引發的錯誤。

手動建立索引

您可以將索引手動新增至 datastore-indexes.xml 檔案,也可以將開發伺服器在 datastore-indexes-auto.xml 檔案中自動建立的索引轉移到 datastore-indexes.xml 檔案。

如需語法的相關資訊,請參閱 datastore-indexes.xml 參考資料

更新索引

當您使用 update 動作上傳應用程式時,更新會包含應用程式的索引設定 (datastore-indexes.xmlgenerated/datastore-indexes-auto.xml 檔案)。如果索引設定定義的索引尚不存在,App Engine 會建立新索引。根據需要在新索引中提及之 Cloud Datastore 中已經存在的資料量而定,建立索引的程序可能需要花費一些時間。如果應用程式執行的查詢需要的索引尚未建構完成,查詢會引發例外狀況。

如要防止這個狀況發生,您必須確定在索引完成建構之前,需要新索引的新版應用程式不是即時版本。實現此目的的其中一種方法是,每當您新增或變更設定中的索引時,都在 appengine-web.xml 中為應用程式提供新的版本編號。應用程式會上傳成為新版本,而且不會自動成為預設版本。建構完索引時,您可以在 GCP 主控台中變更預設版本

另一個做法是在新應用程式上線之前,確定建構的新索引將先各自上傳索引設定,再上傳應用程式。如要僅針對應用程式上傳索引設定,請使用 update_indexes 動作:

./appengine-java-sdk/bin/appcfg.sh update_indexes myapp/war

datastore-indexes.xml 檔案應位於預設模組的 WEB-INF/ 目錄中。

您可以在 GCP 主控台中檢查應用程式索引的狀態

刪除不使用的索引

在索引設定中變更或移除索引時,原始索引並「不會」從 App Engine 中自動刪除。因此,您可以在執行舊版應用程式的同時建構新的索引,也可以在新版出現問題時立即將其還原為舊版。

如果確認已不再需要這些舊的索引,則可使用 vacuum_indexes 動作,將其從 App Engine 中刪除:

./appengine-java-sdk/bin/appcfg.sh vacuum_indexes myapp/war

這個指令會刪除 datastore-indexes.xmlWEB-INF/appengine-generated/datastore-indexes-auto.xml 本機版本未提到的所有應用程式索引。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Java 適用的 App Engine 標準環境