管理索引

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

事前準備

如要在 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", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
      

請注意下列限制:

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

    前往 Firestore 資料庫

  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:要建立索引的欄位名稱
  • ORDERASCENDINGDESCENDING
  • DENSITYSPARSE_ANYDENSE

建立文字索引

如要在集合中搜尋特定字串,請建立文字索引。

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

MongoDB API

使用 createIndex() 方法建立文字索引。在下列範例中,當文件寫入 cities 集合並填入 countryfood 欄位時,這些欄位會編入索引,以供搜尋。

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

欄位必須是字串或字串陣列,才能建立索引。 陣列索引不會編入搜尋索引。因此,為 a.1.b 編製索引時,系統會為 {a: {1: {b: something}}} 中的 something 編製索引,但不會為 {a: [one, {b: something}]} 中的 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」 保加利亞文
「我的」 緬甸文
"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 資料庫

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

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

  4. 輸入集合 ID

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

  6. 點選「建立」

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

建立 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 資料庫

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

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

  4. 輸入集合 ID

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

  6. 點選「建立」

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

刪除索引

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

MongoDB API

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

使用索引名稱刪除索引

db.restaurants.dropIndex("cuisine_index")

使用索引定義刪除索引

db.restaurants.dropIndex({"cuisine" : 1})
Firebase 控制台
  1. 前往 Firebase 控制台的「Firestore Database」頁面。

    前往 Firestore 資料庫

  2. 從資料庫清單中選取資料庫。
  3. 按一下「索引」分頁標籤。
  4. 在索引清單中,針對要刪除的索引,從「更多」按鈕 選擇「刪除」。
  5. 按一下「刪除索引」
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 欄位值,以瞭解作業的整體狀態。

用於取得長時間執行作業狀態的要求,也會傳回 workEstimatedworkCompleted 指標。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 欄位,則表示作業尚未完成。