Quản lý chỉ mục

Trang này mô tả cách quản lý chỉ mục. Để tìm hiểu thêm về chỉ mục, hãy xem bài viết Tổng quan về chỉ mục.

Trước khi bắt đầu

Trước khi có thể tạo chỉ mục trong Cloud Firestore, hãy đảm bảo rằng bạn được chỉ định một trong các vai trò sau:

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

Để cấp một vai trò, hãy xem phần Cấp một vai trò. Để biết thêm thông tin về các vai trò Cloud Firestore và quyền liên quan, hãy xem phần Vai trò được xác định trước.

Nếu bạn đã xác định vai trò tuỳ chỉnh, hãy chỉ định tất cả các quyền sau để tạo chỉ mục:

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

Tạo chỉ mục

Để tạo một chỉ mục, hãy hoàn tất các bước sau:

MongoDB API

Sử dụng phương thức createIndex() để tạo chỉ mục. Ví dụ:

  •   db.restaurants.createIndex({"cuisine" : 1})
      
  •   db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
      
  • Việc tạo chỉ mục bằng db.runCommand() cũng được hỗ trợ với tối đa một chỉ mục.

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

Hãy lưu ý các giới hạn sau:

  • Bạn chỉ có thể tạo một chỉ mục cho mỗi yêu cầu. db.collection.createIndexes() không được hỗ trợ.
  • Nhật ký kiểm tra để tạo chỉ mục bằng MongoDB API sử dụng tên phương thức google.firestore.admin.v1.FirestoreAdmin.CreateIndex.
  • Để biết các lựa chọn chỉ mục được hỗ trợ, hãy xem chỉ mục và thuộc tính chỉ mục.
Firebase bảng điều khiển
  1. Trong bảng điều khiển Firebase, hãy chuyển đến trang Cơ sở dữ liệu Firestore.

    Chuyển đến Cơ sở dữ liệu Firestore

  2. Chọn một cơ sở dữ liệu trong danh sách cơ sở dữ liệu.
  3. Trong thẻ Chỉ mục, hãy nhấp vào Tạo chỉ mục.
  4. Nhập Mã bộ sưu tập.
  5. Thêm một hoặc nhiều đường dẫn đến trường và chọn một lựa chọn chỉ mục cho từng đường dẫn.
  6. Chọn một lựa chọn về sự hiện diện của trường, có thể là không thưa thớt hoặc thưa thớt.
  7. Bạn có thể đặt lựa chọn chỉ mục nhiều khoá (không bắt buộc).
  8. Nhấp vào Tạo.
  9. Chỉ mục mới của bạn sẽ xuất hiện trong danh sách chỉ mục và Cloud Firestore bắt đầu tạo chỉ mục. Khi chỉ mục được tạo, bạn sẽ thấy dấu kiểm màu xanh lục bên cạnh chỉ mục đó. Nếu chỉ mục không được tạo, hãy xem phần Lỗi tạo chỉ mục để biết các nguyên nhân có thể xảy ra.
gcloud CLI

Để tạo một chỉ mục, hãy dùng lệnh gcloud firestore indexes composite create. Đặt api-scope thành 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

Thay thế nội dung sau:

  • DATABASE_ID: mã nhận dạng cơ sở dữ liệu.
  • COLLECTION: tên của một bộ sưu tập.
  • FIELD_CONFIGURATION: một cấu hình trường. Đối với mỗi trường, hãy thêm --field-config=field-path=. Ví dụ:
        --field-config=field-path=user-id,order=descending \
        --field-config=field-path=score,order=descending
        

    Để biết thêm thông tin về cách định cấu hình các trường này, hãy xem phần --field-config.

Để tạo chỉ mục thưa, hãy đặt --density=sparse-any.

Để tạo chỉ mục nhiều khoá, hãy thêm cờ --multikey.

Để tạo một chỉ mục duy nhất, hãy thêm cờ --unique.

Terraform

Sử dụng tài nguyên google_firestore_index và đặt api_scope thành MONGODB_COMPATIBLE_APIquery_scope thành 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"
}

Thay thế nội dung sau:

  • DATABASE_ID: Mã cơ sở dữ liệu cho cơ sở dữ liệu bạn chọn
  • COLLECTION: Tên của tập hợp cần lập chỉ mục
  • FIELD_PATH: Tên của trường cần lập chỉ mục
  • ORDER: Một trong số ASCENDING hoặc DESCENDING
  • DENSITY: Một trong số SPARSE_ANY hoặc DENSE

Tạo chỉ mục văn bản

Tạo chỉ mục văn bản nếu bạn muốn thực hiện tìm kiếm văn bản cho các chuỗi cụ thể trong một tập hợp.

Để tạo chỉ mục văn bản cho bộ sưu tập, hãy hoàn tất các bước sau:

MongoDB API

Dùng phương thức createIndex() để tạo một chỉ mục văn bản. Trong ví dụ sau, khi một tài liệu được ghi vào tập hợp cities với các trường country hoặc food được điền sẵn, các trường này sẽ được lập chỉ mục cho mục đích tìm kiếm.

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

Trường phải là một chuỗi hoặc một mảng gồm các chuỗi cần được lập chỉ mục. Chỉ mục mảng không được lập chỉ mục tìm kiếm. Do đó, việc lập chỉ mục a.1.b sẽ lập chỉ mục something trong {a: {1: {b: something}}}, nhưng không lập chỉ mục trong {a: [one, {b: something}]}.

Bạn cũng có thể tạo chỉ mục bằng db.runCommand(). Bạn chỉ có thể có một chỉ mục văn bản cho mỗi bộ sưu tập, nhưng có thể tạo nhiều chỉ mục thuộc nhiều loại trong một db.runCommand(). Ví dụ sau đây sử dụng db.runCommand() để tạo một chỉ mục văn bản:

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

Chỉ định ngôn ngữ mặc định

Bạn cũng có thể tuỳ ý chỉ định một ngôn ngữ mặc định hoặc một đường dẫn trường trong tài liệu sẽ chứa ngôn ngữ mặc định.

Trong ví dụ sau, myLanguageField được chỉ định là language_override. Khi một tài liệu trong tập hợp cities chứa một trường có tên là myLanguageField, giá trị của trường đó sẽ được dùng để xác định ngôn ngữ lập chỉ mục trường country cho tài liệu cụ thể đó. Giá trị đó sẽ ghi đè ngôn ngữ mặc định của french.

db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
  • Bạn có thể nhập ngôn ngữ dưới dạng tên đầy đủ (english) hoặc mã ngôn ngữ ISO gồm 2 chữ cái (en).
  • Nếu bạn không đặt ngôn ngữ mặc định, thì Cloud Firestore sẽ mặc định là tiếng Anh.
  • Trường ghi đè ngôn ngữ phải là một trường cấp cao nhất. Nếu bạn không đặt, trường ghi đè ngôn ngữ sẽ mặc định là language.
  • Nếu bạn đặt ngôn ngữ mặc định thành ký tự null, thì Cloud Firestore sẽ không sử dụng bất kỳ trường nào làm chế độ ghi đè ngôn ngữ.

Mở rộng để xem danh sách các ngôn ngữ được hỗ trợ

Mã ngôn ngữ Tên ngôn ngữ
"und" Tự động phát hiện
"af" Tiếng Hà Lan ở Nam Phi
"ak" Tiếng Akan
"sq" Tiếng Albania
"am" Tiếng Amhara
"ar" Tiếng Ả Rập
"hy" Tiếng Armenia
"az" Tiếng Azerbaijan
"eu" Tiếng Basque
"be" Tiếng Belarus
"bn" Tiếng Bangla
"bs" Tiếng Bosnia
"bg" Tiếng Bungary
"của tôi" Tiếng Myanmar
"ca" Tiếng Catalan
"ceb" Tiếng Cebuano
"chr" Chữ Cherokee
"zh" Tiếng Trung
"zh-Hant" Tiếng Trung_Phồn thể
"hr" Tiếng Croatia
"cs" Tiếng Séc
"da" Tiếng Đan Mạch
"nl" Tiếng Hà Lan
"en" Tiếng Anh
"eo" Tiếng Esperanto
"et" Tiếng Estonia
"fil" Tiếng Philippines
"fi" Tiếng Phần Lan
"fr" Tiếng Pháp
"gl" Tiếng Galicia
"ka" Tiếng Gruzia
"de" Tiếng Đức
"el" Tiếng Hy Lạp
"gu" Tiếng Gujarat
"ht" Tiếng Haiti_Creole
"ha" Tiếng Hausa
"haw" Hawaii
"iw" Tiếng Do Thái
"xin chào" Tiếng Hindi
"hmn" Tiếng Hmong
"hu" Tiếng Hungary
"là" Tiếng Iceland
"ig" Tiếng Igbo
"id" Tiếng Indonesia
"ga" Tiếng Ireland
"it" Tiếng Ý
"ja" Tiếng Nhật
"jv" Tiếng Java
"kn" Tiếng Kannada
"kk" Tiếng Kazakh
"km" Tiếng Khmer
"ko" Tiếng Hàn
"lo" Tiếng Lào
"la" Tiếng Latinh
"lv" Tiếng Latvia
"lt" Tiếng Lithuania
"lb" Tiếng Luxembourg
"mk" Tiếng Macedonia
"mg" Tiếng Malagasy
"ms" Tiếng Malay
"ml" Tiếng Malayalam
"mt" Tiếng Malta
"mi" Tiếng Maori
"mr" Tiếng Marathi
"mfe" Tiếng Morisyen
"mn" Tiếng Mông Cổ
"sr-ME" Serbia_Montenegro
"ne" Tiếng Nepal
"không" Tiếng Na Uy
"ny" Tiếng Nyanja
"hoặc" Tiếng Odia
"fa" Tiếng Ba Tư
"pl" Tiếng Ba Lan
"pt-BR" Tiếng Bồ Đào Nha_Brazil
"pt-PT" Tiếng Bồ Đào Nha_Bồ Đào Nha
"pa" Tiếng Punjab
"ro" Tiếng Rumani
"ru" Tiếng Nga
"gd" Tiếng Gaelic Scotland
"sr" Tiếng Serbia
"st" Tiếng Nam Sotho
"si" Tiếng Sinhala
"sk" Tiếng Slovak
"sl" Tiếng Sloven
"so" Tiếng Somali
"es" Tiếng Tây Ban Nha
"su" Tiếng Sunda
"sw" Tiếng Swahili
"sv" Tiếng Thuỵ Điển
"tg" Tiếng Tajik
"ta" Tiếng Tamil
"te" Tiếng Telugu
"th" Tiếng Thái
"tr" Tiếng Thổ Nhĩ Kỳ
"uk" Tiếng Ukraina
"ur" Tiếng Urdu
"uz" Tiếng Uzbek
"vi" Tiếng Việt
"cy" Tiếng Wales
"yi" Tiếng Yiddish
"yo" Tiếng Yoruba
"zu" Tiếng Zulu

Phân vùng chỉ mục văn bản

Bạn cũng có thể phân vùng chỉ mục bằng một trường để có thể lọc các truy vấn theo một giá trị trường cụ thể. Cấu hình này cho phép bạn chạy các truy vấn hiệu quả hơn nếu bạn luôn cần một trường cụ thể được lọc trong chỉ mục mà bạn đang truy vấn.

Để tạo chỉ mục có phân vùng, hãy định cấu hình trường firestoreOptions như sau:

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

Địa điểm:

  • PARTITIONED_FIELD là tên của trường dùng cho phân vùng. Giá trị này phải là một chuỗi và phải tham chiếu đến một trường cấp cao nhất. Khi chạy một truy vấn dựa trên chỉ mục được phân vùng, bạn có thể lọc kết quả dựa trên giá trị của trường này. Ví dụ: bạn có thể phân vùng chỉ mục bằng cách sử dụng city. Nếu bạn xác định trường city trong chỉ mục văn bản, thì người dùng có thể truy vấn theo một thành phố cụ thể.

    Phân vùng chỉ được phép có một trường. Nếu phân vùng một chỉ mục, thì bạn chỉ có thể chạy các truy vấn trong đó trường được phân vùng được chỉ định.

Giới hạn

  • Bạn chỉ có thể tạo một chỉ mục cho mỗi yêu cầu.
  • Nhật ký kiểm tra để tạo chỉ mục bằng API MongoDB sử dụng tên phương thức google.firestore.admin.v1.FirestoreAdmin.CreateIndex.
  • Để biết các lựa chọn chỉ mục được hỗ trợ, hãy xem chỉ mục và thuộc tính chỉ mục.

Firebase bảng điều khiển

  1. Trong bảng điều khiển Firebase, hãy chuyển đến trang Cơ sở dữ liệu Firestore.

    Chuyển đến Cơ sở dữ liệu Firestore

  2. Chọn một cơ sở dữ liệu trong danh sách cơ sở dữ liệu.

  3. Trong thẻ Chỉ mục, hãy nhấp vào Tạo chỉ mục.

  4. Nhập Mã bộ sưu tập.

  5. Thêm một hoặc nhiều đường dẫn đến trường và chọn một lựa chọn chỉ mục cho từng đường dẫn.

  6. Nhấp vào Tạo.

  7. Chỉ mục mới của bạn sẽ xuất hiện trong danh sách chỉ mục và các thao tác tương thích với MongoDB sẽ bắt đầu tạo chỉ mục. Khi chỉ mục được tạo, bạn sẽ thấy dấu kiểm màu xanh lục bên cạnh chỉ mục đó. Nếu chỉ mục không được tạo, hãy xem Lỗi khi tạo chỉ mục để biết các nguyên nhân có thể xảy ra.

Tạo chỉ mục 2dsphere

Tạo chỉ mục 2dsphere để thực hiện các truy vấn không gian địa lý và tìm kiếm những tài liệu nằm trong một phạm vi nhất định từ một kinh độ và vĩ độ cụ thể.

Để tạo chỉ mục 2dsphere cho bộ sưu tập của bạn, hãy hoàn tất các bước sau:

MongoDB API

Sử dụng phương thức createIndex() để tạo một chỉ mục. Ví dụ:

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

Việc tạo chỉ mục bằng db.runCommand() cũng được hỗ trợ với tối đa một chỉ mục:

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

Phân vùng chỉ mục 2dsphere

Bạn cũng có thể phân vùng chỉ mục bằng một trường để có thể lọc các truy vấn theo một giá trị trường cụ thể. Cấu hình này cho phép bạn chạy các truy vấn hiệu quả hơn nếu bạn luôn cần một trường cụ thể được lọc trong chỉ mục mà bạn đang truy vấn.

Để tạo chỉ mục có phân vùng, hãy định cấu hình trường firestoreOptions như sau:

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

Địa điểm:

  • PARTITIONED_FIELD là tên của trường dùng cho phân vùng. Khi chạy một truy vấn dựa trên chỉ mục được phân vùng, bạn có thể lọc kết quả dựa trên giá trị của trường này. Ví dụ: nếu chỉ mục của bạn có trường region cho vị trí theo khu vực, bạn có thể phân vùng chỉ mục bằng region để người dùng có thể truy vấn các nhà hàng trong khu vực của họ.

    Nếu phân vùng một chỉ mục, thì bạn chỉ có thể chạy các truy vấn trong đó trường được phân vùng được chỉ định.

Giới hạn

  • Bạn chỉ có thể tạo một chỉ mục cho mỗi yêu cầu.
  • Nhật ký kiểm tra để tạo chỉ mục bằng API MongoDB sử dụng tên phương thức google.firestore.admin.v1.FirestoreAdmin.CreateIndex.
  • Để biết các lựa chọn chỉ mục được hỗ trợ, hãy xem chỉ mục và thuộc tính chỉ mục.

Firebase bảng điều khiển

  1. Trong bảng điều khiển Firebase, hãy chuyển đến trang Cơ sở dữ liệu Firestore.

    Chuyển đến Cơ sở dữ liệu Firestore

  2. Chọn một cơ sở dữ liệu trong danh sách cơ sở dữ liệu.

  3. Trong thẻ Chỉ mục, hãy nhấp vào Tạo chỉ mục.

  4. Nhập Mã bộ sưu tập.

  5. Thêm một hoặc nhiều đường dẫn đến trường và chọn một lựa chọn chỉ mục cho từng đường dẫn.

  6. Nhấp vào Tạo.

  7. Chỉ mục mới của bạn sẽ xuất hiện trong danh sách chỉ mục và các thao tác tương thích với MongoDB sẽ bắt đầu tạo chỉ mục. Khi chỉ mục được tạo, bạn sẽ thấy dấu kiểm màu xanh lục bên cạnh chỉ mục đó. Nếu chỉ mục không được tạo, hãy xem Lỗi khi tạo chỉ mục để biết các nguyên nhân có thể xảy ra.

Xoá chỉ mục

Để xoá một chỉ mục, hãy hoàn tất các bước sau:

MongoDB API

Sử dụng phương thức dropIndex() để xoá một chỉ mục. Ví dụ:

Xoá chỉ mục bằng tên chỉ mục

db.restaurants.dropIndex("cuisine_index")

Xoá chỉ mục bằng định nghĩa chỉ mục

db.restaurants.dropIndex({"cuisine" : 1})
Firebase bảng điều khiển
  1. Trong bảng điều khiển Firebase, hãy chuyển đến trang Cơ sở dữ liệu Firestore.

    Chuyển đến Cơ sở dữ liệu Firestore

  2. Chọn một cơ sở dữ liệu trong danh sách cơ sở dữ liệu.
  3. Nhấp vào thẻ Chỉ mục.
  4. Trong danh sách chỉ mục, hãy chọn Xoá trong nút Tuỳ chọn khác cho chỉ mục bạn muốn xoá.
  5. Nhấp vào Xoá chỉ mục.
gcloud CLI
  1. Để tìm tên của chỉ mục, hãy dùng lệnh gcloud firestore indexes composite list.

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

    Thay thế DATABASE_ID bằng mã cơ sở dữ liệu.

  2. Để xoá chỉ mục, hãy dùng lệnh gcloud firestore indexes composite delete.

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

    Thay thế nội dung sau:

    • INDEX_NAME: tên của một chỉ mục
    • DATABASE_ID: mã nhận dạng cơ sở dữ liệu

Thời gian xây dựng chỉ mục

Để tạo chỉ mục, Cloud Firestore phải tạo chỉ mục rồi điền lại các mục nhập chỉ mục bằng dữ liệu hiện có. Thời gian cần thiết để tạo một chỉ mục được xác định bằng những yếu tố sau:

  • Thời gian xây dựng chỉ mục tối thiểu là vài phút, ngay cả đối với cơ sở dữ liệu trống.

  • Thời gian cần thiết để bổ sung các mục nhập chỉ mục phụ thuộc vào lượng dữ liệu hiện có thuộc chỉ mục mới. Càng có nhiều giá trị trường khớp với định nghĩa chỉ mục, thì thời gian điền lại các mục nhập chỉ mục càng lâu.

Quản lý các thao tác diễn ra trong thời gian dài

Quá trình tạo chỉ mục là các thao tác diễn ra trong thời gian dài. Các phần sau đây mô tả cách xử lý các hoạt động diễn ra trong thời gian dài đối với chỉ mục.

Sau khi bạn bắt đầu tạo một chỉ mục, Cloud Firestore sẽ chỉ định cho thao tác một tên duy nhất. Tên thao tác có tiền tố là projects/PROJECT_ID/databases/DATABASE_ID/operations/, ví dụ:

projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

Bạn có thể bỏ qua tiền tố khi chỉ định tên thao tác cho lệnh describe.

Liệt kê tất cả các thao tác diễn ra trong thời gian dài

Để liệt kê các thao tác diễn ra trong thời gian dài, hãy sử dụng lệnh gcloud firestore operations list. Lệnh này liệt kê các thao tác đang diễn ra và các thao tác đã hoàn tất gần đây. Các thao tác sẽ được liệt kê trong vài ngày sau khi hoàn tất:

gcloud firestore operations list

Kiểm tra trạng thái hoạt động

Thay vì liệt kê tất cả các thao tác diễn ra trong thời gian dài, bạn có thể liệt kê thông tin chi tiết của một thao tác duy nhất:

gcloud firestore operations describe operation-name

Ước tính thời gian hoàn thành

Khi thao tác của bạn chạy, hãy xem giá trị của trường state để biết trạng thái tổng thể của thao tác.

Yêu cầu về trạng thái của một thao tác diễn ra trong thời gian dài cũng trả về các chỉ số workEstimatedworkCompleted. workEstimated cho biết tổng số lượng tài liệu ước tính mà một thao tác sẽ xử lý. workCompleted cho biết số lượng tài liệu đã xử lý cho đến thời điểm hiện tại. Sau khi thao tác hoàn tất, workCompleted sẽ phản ánh tổng số tài liệu đã được xử lý thực tế, có thể khác với giá trị của workEstimated.

Để ước tính tiến trình của một thao tác, hãy chia workCompleted cho workEstimated.

Sau đây là ví dụ về tiến trình tạo chỉ mục:

{
  "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"
        }
       },
    },
    ...

Khi một thao tác hoàn tất, nội dung mô tả thao tác sẽ chứa "done": true. Xem giá trị của trường state để biết kết quả của thao tác. Nếu bạn không đặt trường done trong phản hồi, thì thao tác chưa hoàn tất.