管理索引

本頁面說明如何管理 Firestore Enterprise 版本的索引。

如要進一步瞭解 Firestore Enterprise 版索引,請參閱「索引總覽」。

事前準備

您必須具備下列任一角色,才能在 Cloud Firestore 建立索引:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

如要授予角色,請參閱「授予單一角色」。如要進一步瞭解 Cloud Firestore 角色和相關權限,請參閱「預先定義的角色」。

如果您已定義自訂角色,請指派下列所有權限來建立索引:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

建立索引

如要建立索引,請完成下列步驟:

Firebase 控制台
  1. 在 Firebase 控制台中,前往「Firestore Database」頁面。

    前往「Firestore Database」

  2. 從資料庫清單中選取資料庫。
  3. 在「索引」分頁中,按一下「建立索引」。
  4. 輸入集合 ID。
  5. 新增一或多個欄位路徑,並為每個路徑選取索引選項。
  6. 選取欄位存在選項:「非稀疏」或「稀疏」。
  7. 點選「建立」。
  8. 新的索引會顯示在索引清單中,Cloud Firestore 會開始建立索引。索引建立完成後,旁邊會顯示綠色勾號。如果未建立索引,請參閱「索引建構錯誤」一節,瞭解可能原因。
gcloud CLI

如要建立索引,請使用 gcloud firestore indexes composite create 指令。

gcloud firestore indexes composite create \
--database='DATABASE_ID' \
--collection-group=COLLECTION \
--field-config=FIELD_CONFIGURATION \
--query-scope=collection-group \
--density=dense

更改下列內容:

  • DATABASE_ID:資料庫 ID。
  • COLLECTION:集合名稱。
  • FIELD_CONFIGURATION:欄位設定。請為每個欄位新增 --field-config=field-path=。例如:
        --field-config=field-path=user-id,order=descending \
        --field-config=field-path=score,order=descending
        

    如要進一步瞭解如何設定這些欄位,請參閱 --field-config。

如要建立稀疏索引,請設定 --density=sparse-any。

如要建立不重複索引,請新增 --unique 旗標。

Terraform

使用 google_firestore_index 資源。

resource "google_firestore_index" "index" {
  database    = "DATABASE_ID"
  collection  = "COLLECTION"
  query_scope = "COLLECTION_GROUP"

  // You can include multiple field blocks
  fields {
    field_path = "FIELD_PATH"
    order      = "ORDER"
  }

  // Optional
  multikey = true
  density  = "DENSITY"
}

更改下列內容:

  • DATABASE_ID:所選資料庫的資料庫 ID
  • COLLECTION:要建立索引的集合名稱
  • FIELD_PATH:要建立索引的欄位名稱
  • ORDER:ASCENDING 或 DESCENDING
  • DENSITY:SPARSE_ANY 或 DENSE

建立文字索引

如要建立文字索引,請完成下列步驟:

Google Cloud 控制台
  1. 在 Google Cloud 控制台中,前往「Databases」(資料庫) 頁面。

    前往「資料庫」

  2. 從資料庫清單中選取資料庫。
  3. 在導覽選單中,按一下「Indexes」(索引)。
  4. 選用:輸入索引名稱。
  5. 前往「搜尋類型」,然後選取「文字」。
  6. 輸入集合 ID。
  7. 設定一或多個要建立索引的欄位。
  8. 設定索引的查詢範圍。
  9. 選取預設語言。
  10. 選用:將語言覆寫路徑設為包含文件語言設定的欄位名稱。
  11. 點選「建立」。
  12. 新的索引會顯示在索引清單中,Cloud Firestore 會開始建立索引。索引建立完成後,旁邊會顯示綠色勾號。
gcloud CLI

如要建立文字索引,請使用 gcloud firestore indexes composite create 指令:

gcloud firestore indexes composite create \
  --database='DATABASE_ID' \
  --collection-group=COLLECTION_GROUP \
  --field-config=field-path=FIELD_NAME,search-config='{"text-spec": {"index-specs": [{"index-type": "tokenized", "match-type": "match-globally"}]}}' \
  --search-index-options=text-language=en \
  --async

更改下列內容:

  • DATABASE_ID:資料庫 ID。
  • COLLECTION_GROUP:要建立索引的集合 ID。
  • FIELD_NAME:要建立索引的欄位名稱。

--async 旗標會在背景執行索引建立作業。

建立地理空間索引

如要建立地理空間索引,請完成下列步驟:

Google Cloud 控制台
  1. 在 Google Cloud 控制台中,前往「Databases」(資料庫) 頁面。

    前往「資料庫」

  2. 從資料庫清單中選取資料庫。
  3. 在導覽選單中,按一下「Indexes」(索引)。
  4. 選用:輸入索引名稱。
  5. 前往「Search Type」,然後選取「Geo (2dsphere)」。
  6. 輸入集合 ID。
  7. 設定一或多個要建立索引的欄位。
  8. 設定索引的查詢範圍。
  9. 點選「建立」。

新的索引會顯示在索引清單中,Cloud Firestore 會開始建立索引。索引建立完成後,旁邊會顯示綠色勾號。

gcloud CLI

如要建立地理空間索引,請使用 gcloud firestore indexes composite create 指令:

gcloud firestore indexes composite create \
  --database='DATABASE_ID' \
  --collection-group=COLLECTION_GROUP \
  --field-config=field-path=FIELD_NAME,search-config='{"geo-spec": {}}' \
  --async

更改下列內容:

  • DATABASE_ID:資料庫 ID。
  • COLLECTION_GROUP:要建立索引的集合 ID。
  • FIELD_NAME:要建立索引的欄位名稱。

--async 旗標會在背景執行索引建立作業。

刪除索引

如要刪除索引,請完成下列步驟:

Firebase 控制台
  1. 在 Firebase 控制台中,前往「Firestore Database」頁面。

    前往「Firestore Database」

  2. 從資料庫清單中選取資料庫。
  3. 按一下「Indexes」(索引) 分頁標籤。
  4. 在索引清單中,找到要刪除的索引,然後點選「More」(更多) 按鈕 ,並選擇「Delete」(刪除)。
  5. 按一下「Delete Index」(刪除索引)。
gcloud CLI
  1. 如要找出索引名稱,請使用 gcloud firestore indexes composite list 指令。

    gcloud firestore indexes composite list \
    --database='DATABASE_ID'

    將 DATABASE_ID 替換為資料庫 ID。

  2. 如要刪除索引,請使用 gcloud firestore indexes composite delete 指令。

    gcloud firestore indexes composite delete INDEX_NAME \
    --database='DATABASE_ID'

    更改下列內容:

    • INDEX_NAME:索引名稱
    • DATABASE_ID:資料庫 ID

索引建構時間

如要建立索引,Cloud Firestore 必須建立索引,然後使用現有資料回填索引項目。建立索引所需的時間取決於下列因素:

  • 即使是空白資料庫,建立索引也至少需要幾分鐘。

  • 補充索引項目所需的時間,取決於新索引中現有資料的多寡。符合索引定義的欄位值越多,補充索引項目所需的時間就越長。

管理長時間執行的作業

索引建構作業是長時間執行的作業。以下各節說明如何處理索引的長時間執行作業。

開始建立索引後,Cloud Firestore 會為作業指派不重複的名稱。作業名稱的前置字串為 projects/PROJECT_ID/databases/DATABASE_ID/operations/,例如:

projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

為 describe 指令指定作業名稱時,可以省略前置字元。

列出所有長時間執行的作業

如要列出長時間執行的作業,請使用 gcloud firestore operations list 指令。這個指令會列出進行中和最近完成的作業。作業完成後會列出幾天:

gcloud firestore operations list

查看作業狀態

您可以列出單一作業的詳細資料,而非列出所有長時間執行的作業:

gcloud firestore operations describe operation-name

估算完成時間

作業執行時,可查看 state 欄位值,以瞭解作業的整體狀態。

要求長時間執行的作業狀態時,也會傳回 workEstimated 和 workCompleted 指標。workEstimated 顯示作業預計處理的文件總數。workCompleted 顯示目前已處理的文件數量。作業完成後,workCompleted 會反映實際處理的文件總數,可能與 workEstimated 的值不同。

如要估算作業進度,請將 workCompleted 除以 workEstimated。

以下是建立索引的進度範例:

{
  "operations": [
    {
      "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI",
      "metadata": {
        "@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata",
        "common": {
          "operationType": "CREATE_INDEX",
          "startTime": "2020-06-23T16:52:25.697539Z",
          "state": "PROCESSING"
        },
        "progressDocuments": {
          "workCompleted": "219327",
          "workEstimated": "2198182"
        }
       },
    },
    ...

作業完成後,作業說明會包含 "done": true。查看 state 欄位值可得知作業結果。如果回應中未設定 done 欄位,則表示作業尚未完成。