管理索引

本頁面說明如何管理索引。如要進一步瞭解索引,請參閱「索引總覽」。

事前準備

您必須具備下列任一角色,才能在 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

建立索引

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

MongoDB API

使用 createIndex() 方法建立索引。例如:

  •   db.restaurants.createIndex({"cuisine" : 1})
      
  •   db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
      
  • 也支援使用 db.runCommand() 建立索引,最多可建立一個索引。

      db.runCommand({"createIndexes":"restaurant", "indexes": [{"key": {"cuisine":1}, "name": "cuisine_index"}]})
      

請注意下列限制:

  • 每個要求只能建立一個索引。不支援 db.collection.createIndexes()。
  • 使用 MongoDB API 建立索引的稽核記錄會使用方法名稱 google.firestore.admin.v1.FirestoreAdmin.CreateIndex。
  • 如要瞭解支援的索引選項,請參閱「索引和索引屬性」。
Firebase 控制台
  1. 在 Firebase 控制台中,前往「Firestore Database」頁面。

    前往「Firestore Database」

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

如要建立索引,請使用 gcloud firestore indexes composite create 指令。將 api-scope 設為 mongodb-compatible-api。

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

更改下列內容:

  • 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。

如要建立多鍵索引,請新增 --multikey 旗標。

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

Terraform

使用 google_firestore_index 資源,並將 api_scope 設為 MONGODB_COMPATIBLE_API,query_scope 設為 COLLECTION_GROUP。

resource "google_firestore_index" "index" {
  database    = "DATABASE_ID"
  collection  = "COLLECTION"
  api_scope   = "MONGODB_COMPATIBLE_API"
  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

建立文字索引

如要對集合中的特定字串執行 Text Search,請建立文字索引。

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

MongoDB API

使用 createIndex() 方法建立文字索引。在以下範例中,當文件寫入 cities 集合,且 country 或 food 欄位已填入資料時,系統會為這些欄位建立索引,以便搜尋。

db.cities.createIndex({"country": "text", "food": "text"})

欄位必須是字串或字串陣列,才能建立索引。陣列索引不會編入搜尋索引。因此,為 a.1.b 建立索引時,系統會為 {a: {1: {b: something}}} 中的 something 建立索引,但不會為 {a: [one, {b: something}]} 中的 建立索引。

您也可以使用 db.runCommand() 建立索引。每個集合只能有一個文字索引,但您可以在一個 db.runCommand() 中建立多個不同類型的索引。以下範例使用 db.runCommand() 建立文字索引:

db.runCommand({
  createIndexes: "cities",
  indexes: [
    {
      key: { "country": "text", "food": "text" },
      name: "country_text_food_text"
    }
  ]
})

指定預設語言

您也可以選擇指定預設語言,或指定文件中包含預設語言的欄位路徑。

在以下範例中,myLanguageField 指定為 language_override。如果 cities 集合中的文件包含名為 myLanguageField 的欄位,系統會使用該欄位的值,決定為該特定文件的 country 欄位建立索引時使用的語言。這個值會覆寫預設語言 french。

db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
  • 輸入語言時,可以使用完整名稱 (english) 或雙字母 ISO 語言代碼 (en)。
  • 如果未設定預設語言,Cloud Firestore 預設為英文。
  • 語言覆寫欄位必須是頂層欄位。如未設定,語言覆寫欄位會預設為 language。
  • 如果將預設語言設為 null 字元,Cloud Firestore 就不會使用任何欄位做為語言覆寫。

展開支援語言清單

語言代碼 語言名稱
"und" 自動偵測
"af" 南非荷蘭文
"ak" 阿肯文
"sq" 阿爾巴尼亞文
"am" 阿姆哈拉文
"ar" 阿拉伯文
"hy" 亞美尼亞文
"az" 亞塞拜然文
"eu" 巴斯克文
"be" 白俄羅斯語
"bn" 孟加拉文
"bs" 波士尼亞文
"bg" 保加利亞文
"my" 緬甸文
"ca" 加泰隆尼亞文
"ceb" 宿霧文
"chr" 切羅基文
"zh" 中文
"zh-Hant" Chinese_Traditional
"hr" 克羅埃西亞文
"cs" 捷克文
"da" 丹麥文
"nl" 荷蘭文
"en" 英文
"eo" 世界語
"et" 愛沙尼亞文
"fil" 菲律賓文
"fi" 芬蘭文
"fr" 法文
"gl" 加里西亞文
"ka" 喬治亞文
"de" 德文
"el" 希臘文
"gu" 古吉拉特文
"ht" Haitian_Creole
"ha" 豪薩文
"haw" 夏威夷文
"iw" 希伯來文
「嗨」 北印度文
"hmn" 苗文
"hu" 匈牙利文
"is" 冰島文
"ig" 伊博文
"id" 印尼文
"ga" 愛爾蘭文
"it" 義大利文
"ja" 日文
"jv" 爪哇語
"kn" 卡納達文
"kk" 哈薩克文
"km" 高棉文
"ko" 韓文
"lo" 寮文
"la" 拉丁文
"lv" 拉脫維亞文
"lt" 立陶宛文
"lb" 盧森堡文
"mk" 馬其頓文
"mg" 馬達加斯加文
"ms" 馬來文
"ml" 馬拉雅拉姆文
"mt" 馬耳他文
"mi" 毛利文
"mr" 馬拉地文
"mfe" 模里西斯文
"mn" 蒙古文
"sr-ME" Serbian_Montenegro
"ne" 尼泊爾文
"no" 挪威文
"ny" 尼揚賈文
「或」 歐利亞文
"fa" 波斯文
"pl" 波蘭文
"pt-BR" Portuguese_Brazil
"pt-PT" Portuguese_Portugal
"pa" 旁遮普文
"ro" 羅馬尼亞文
"ru" 俄文
"gd" 蘇格蘭蓋爾文
"sr" 塞爾維亞文
"st" 席索托文
"si" 錫蘭文
"sk" 斯洛伐克文
"sl" 斯洛維尼亞文
"so" 索馬里文
"es" 西班牙文
"su" 巽他文
"sw" 史瓦西里文
"sv" 瑞典文
"tg" 塔吉克文
"ta" 泰米爾文
"te" 泰盧固文
"th" 泰文
"tr" 土耳其文
"uk" 烏克蘭語
"ur" 烏都文
"uz" 烏茲別克文
"vi" 越南文
"cy" 威爾斯文
"yi" 意第緒語
"yo" 約魯巴文
"zu" 祖魯文

對文字索引進行分區

您也可以使用欄位分割索引,以便依特定欄位值篩選查詢。如果您一律需要篩選查詢索引中的特定欄位,這項設定可讓您執行更有效率的查詢。

如要建立含有分區的索引,請按照下列方式設定 firestoreOptions 欄位:

db.runCommand({
  createIndexes: "cities",
  indexes: [
    {
      key: { "country": "text", "food": "text"},
      name: "country_text_food_text"
      firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
    }
  ]
})

其中:

  • PARTITIONED_FIELD 是用於分區的欄位名稱。這個值必須是字串,且必須參照頂層欄位。對分區索引執行查詢時,您可以根據這個欄位的值篩選結果。舉例來說,您可以使用 city 分割索引。如果在文字索引中定義 city 欄位,使用者就能查詢特定城市。

    分區只能有一個欄位。如果對索引進行分區,則只能執行指定分區欄位的查詢。

限制

  • 每項要求只能建立一個索引。
  • 使用 MongoDB API 建立索引的稽核記錄會使用方法名稱 google.firestore.admin.v1.FirestoreAdmin.CreateIndex。
  • 如要瞭解支援的索引選項,請參閱「索引和索引屬性」。

Firebase 控制台

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

    前往「Firestore Database」

  2. 從資料庫清單中選取資料庫。

  3. 在「索引」分頁中,按一下「建立索引」。

  4. 輸入集合 ID。

  5. 新增一或多個欄位路徑,並為每個路徑選取索引選項。

  6. 點選「建立」。

  7. 新的索引會顯示在索引清單中,MongoDB 相容作業會開始建立索引。索引建立完成後,旁邊會顯示綠色勾號。如果未建立索引,請參閱「索引建構錯誤」一節,瞭解可能原因。

gcloud CLI

如要建立文字索引,請使用 gcloud firestore indexes composite create 指令。將 --api-scope 設為 mongodb-compatible-api。

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"}]}}' \
  --api-scope=mongodb-compatible-api \
  --search-index-options=text-language=en \
  --async

更改下列內容:

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

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

建立 2dsphere 索引

建立 2dsphere 索引,執行地理空間查詢,並搜尋與特定經緯度相距一定範圍內的文件。

如要為集合建立 2dsphere 索引,請完成下列步驟:

MongoDB API

請使用 createIndex() 方法建立索引。例如:

db.restaurants.createIndex({"location" : "2dsphere", "region": "2dsphere"})

系統也支援使用 db.runCommand() 建立索引,但最多只能建立一個索引:

db.runCommand({
  createIndexes: "restaurants",
  indexes: [
    {
      key: { "location": "2dsphere", "region": "2dsphere" },
      name: "location_2dsphere_region_2dsphere"
    }
  ]
})

對 2dsphere 索引進行分區

您也可以使用欄位分割索引,以便依特定欄位值篩選查詢。如果您一律需要篩選查詢索引中的特定欄位,這項設定可讓您執行更有效率的查詢。

如要建立含有分區的索引,請按照下列方式設定 firestoreOptions 欄位:

db.runCommand({
  createIndexes: "restaurants",
  indexes: [
    {
      key: { "location": "2dsphere", "region": "2dsphere" },
      name: "location_2dsphere_region_2dsphere"
      firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
    }
  ]
})

其中:

  • PARTITIONED_FIELD 是用於分區的欄位名稱。對分區索引執行查詢時,您可以根據這個欄位的值篩選結果。舉例來說,如果索引有區域位置的 region 欄位,您可以使用 region 分割索引,讓使用者查詢所在區域的餐廳。

    如果對索引進行分區,則只能在指定分區欄位的位置執行查詢。

限制

  • 每項要求只能建立一個索引。
  • 使用 MongoDB API 建立索引的稽核記錄會使用方法名稱 google.firestore.admin.v1.FirestoreAdmin.CreateIndex。
  • 如要瞭解支援的索引選項,請參閱「索引和索引屬性」。

Firebase 控制台

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

    前往「Firestore Database」

  2. 從資料庫清單中選取資料庫。

  3. 在「索引」分頁中,按一下「建立索引」。

  4. 輸入集合 ID。

  5. 新增一或多個欄位路徑,並為每個路徑選取索引選項。

  6. 點選「建立」。

  7. 新的索引會顯示在索引清單中,MongoDB 相容作業會開始建立索引。索引建立完成後,旁邊會顯示綠色勾號。如果未建立索引,請參閱「索引建構錯誤」一節,瞭解可能原因。

gcloud CLI

如要建立 2dsphere 索引,請使用 gcloud firestore indexes composite create 指令。將 --api-scope 設為 mongodb-compatible-api。

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

更改下列內容:

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

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

刪除索引

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

MongoDB API

使用 dropIndex() 方法刪除索引。例如:

使用索引名稱刪除索引

db.restaurants.dropIndex("cuisine_index")

使用索引定義刪除索引

db.restaurants.dropIndex({"cuisine" : 1})
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 欄位,則表示作業尚未完成。