管理企业版索引


索引编入行为取决于数据库的版本。本页面介绍了如何管理 Firestore 企业版的索引。如需了解 Firestore 标准版, 请参阅 Firestore 标准版索引概览

如需详细了解 Firestore 企业版索引,请参阅 索引概览

准备工作

如需在 Firestore 中创建索引,请确保您已获分配以下任一角色:

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

如需授予角色,请参阅授予单个角色。如需详细了解 Firestore 角色及关联权限,请参阅 预定义角色

如果您定义了自定义角色,则必须为其分配以下所有权限才能创建索引:

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

创建索引

如需创建索引,请完成以下步骤:

Google Cloud 控制台
  1. 在 Google Cloud 控制台中,前往 数据库 页面。

    前往“数据库”

  2. 从数据库列表中选择一个数据库。
  3. 在导航菜单中,点击索引
  4. 点击创建索引
  5. 输入集合 ID
  6. 添加一个或多个字段路径,并为每个字段路径选择一个索引选项。
  7. 选择字段存在性选项,可以是“非稀疏”或“稀疏”。
  8. (可选)设置唯一索引选项。
  9. 点击创建
  10. 新索引会显示在索引列表中,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:要编入索引的字段的名称
  • ORDERASCENDINGDESCENDING 之一。
  • DENSITYSPARSE_ANYDENSE 之一。

创建文本索引

使用 Google Cloud 控制台创建文本索引。

  1. Google Cloud 控制台 中,前往数据库 页面。

    前往“数据库”

  2. 从数据库列表中选择一个数据库。

  3. 在导航菜单中,点击索引

  4. (可选)输入索引的名称。

  5. 前往搜索类型 ,然后选择文本

  6. 输入集合 ID

  7. 配置一个或多个要编入索引的字段。

  8. 设置索引的查询范围。

  9. 选择默认语言。

  10. (可选)将语言覆盖路径设置为包含文档语言设置的字段名称。

  11. 点击创建

  12. 新索引会显示在索引列表中,Firestore 开始创建索引。创建索引后,索引旁边会显示一个绿色对勾标记。

创建地理空间索引

使用 Google Cloud 控制台创建地理空间索引。

  1. Google Cloud 控制台 中,前往数据库 页面。

    前往“数据库”

  2. 从数据库列表中选择一个数据库。

  3. 在导航菜单中,点击索引

  4. (可选)输入索引的名称。

  5. 前往搜索类型 ,然后选择 Geo (2dsphere)

  6. 输入集合 ID

  7. 配置一个或多个要编入索引的字段。

  8. 设置索引的查询范围。

  9. 点击创建

    新索引会显示在索引列表中,Firestore 开始创建索引。创建索引后,索引旁边会显示一个绿色对勾标记。

删除索引

如需删除索引,请完成以下步骤:

Google Cloud 控制台
  1. 在 Google Cloud 控制台中,前往 数据库 页面。

    前往“数据库”

  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

索引构建时间

如需构建索引,Firestore 必须创建索引,然后使用现有数据回填索引条目。创建索引所需的时间取决于以下因素:

  • 索引的最短构建时间为几分钟,即使空数据库也是如此。

  • 回填索引条目所需的时间取决于属于新索引的现有数据的数量。与索引定义匹配的字段值越多,回填索引条目所需的时间就越长。

管理长时间运行的操作

索引构建是长时间运行的操作。以下部分介绍了如何处理索引的长时间运行的操作。

开始创建索引后,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 字段的值可了解操作的总体状态。

用于获取长时间运行的操作的状态的请求也会返回指标 workEstimatedworkCompletedworkEstimated 表示操作将处理的预估文档总数。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 字段,则表示操作尚未完成。