Управление индексами

На этой странице описано, как управлять индексами для 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.

    Перейти к базе данных Firestore

  2. Выберите базу данных из списка.
  3. На вкладке Индексы нажмите Создать индекс.
  4. Введите идентификатор коллекции.
  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 – идентификатор базы данных.
  • 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 – идентификатор выбранной базы данных.
  • COLLECTION – название коллекции для индексирования.
  • FIELD_PATH – название поля для индексирования.
  • ORDER: ASCENDING или DESCENDING.
  • DENSITY: SPARSE_ANY или DENSE.

Как создать текстовый индекс

Чтобы создать текстовый индекс, выполните следующие действия:

Консоль Google Cloud
  1. В консоли Google Cloud перейдите на страницу Databases (Базы данных).

    Перейти к базам данных

  2. Выберите базу данных из списка.
  3. В меню навигации нажмите Индексы.
  4. При необходимости введите название индекса.
  5. В разделе Тип поиска выберите Текст.
  6. Введите идентификатор коллекции.
  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 – идентификатор базы данных.
  • COLLECTION_GROUP – идентификатор коллекции, которую нужно проиндексировать.
  • FIELD_NAME – название поля для индексирования.

Флаг --async запускает операцию создания индекса в фоновом режиме.

Как создать геопространственный индекс

Чтобы создать геопространственный индекс, выполните следующие действия:

Консоль Google Cloud
  1. В консоли Google Cloud перейдите на страницу Databases (Базы данных).

    Перейти к базам данных

  2. Выберите базу данных из списка.
  3. В меню навигации нажмите Индексы.
  4. При необходимости введите название индекса.
  5. Перейдите в раздел Search Type (Тип поиска) и выберите Geo (2dsphere) (Гео (2dsphere)).
  6. Введите идентификатор коллекции.
  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 – идентификатор базы данных.
  • COLLECTION_GROUP – идентификатор коллекции, которую нужно проиндексировать.
  • FIELD_NAME – название поля для индексирования.

Флаг --async запускает операцию создания индекса в фоновом режиме.

Как удалить индекс

Чтобы удалить индекс, выполните следующие действия:

Консоль Firebase
  1. В консоли Firebase перейдите на страницу База данных Firestore.

    Перейти к базе данных Firestore

  2. Выберите базу данных из списка.
  3. Откройте вкладку Индексы.
  4. В списке индексов нажмите кнопку Ещё рядом с нужным индексом и выберите Удалить.
  5. Нажмите Delete Index (Удалить индекс).
gcloud CLI
  1. Чтобы найти название индекса, используйте команду gcloud firestore indexes composite list.

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

    Замените DATABASE_ID на идентификатор базы данных.

  2. Чтобы удалить индекс, используйте команду gcloud firestore indexes composite delete.

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

    Замените следующее:

    • INDEX_NAME – название индекса.
    • DATABASE_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 в ответе не задано, значит операция не завершена.