Дополнительную информацию об индексах Firestore Enterprise можно найти в обзоре индексов.
Подготовка
Чтобы создать индекс в Cloud Firestore, вам должна быть назначена одна из следующих ролей:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
Подробнее о том, как предоставить роль… Подробнее о Cloud Firestoreролях и связанных с ними разрешениях…
Если вы определили специальные роли, назначьте все перечисленные ниже разрешения для создания индексов.
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
Как создать индекс
Чтобы создать индекс, выполните следующие действия:
Консоль Firebase
-
В консоли Firebase перейдите на страницу База данных Firestore.
- Выберите базу данных из списка.
- На вкладке Индексы нажмите Создать индекс.
- Введите идентификатор коллекции.
- Добавьте один или несколько путей к полям и выберите вариант индекса для каждого из них.
- Выберите вариант наличия поля: разреженное или неразреженное.
- Нажмите Создать.
- Новый индекс появится в списке индексов, и 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
-
В консоли Google Cloud перейдите на страницу Databases (Базы данных).
- Выберите базу данных из списка.
- В меню навигации нажмите Индексы.
- При необходимости введите название индекса.
- В разделе Тип поиска выберите Текст.
- Введите идентификатор коллекции.
- Настройте одно или несколько полей для индексирования.
- Задайте область запроса для индекса.
- Выберите язык по умолчанию.
- При необходимости укажите путь к полю, содержащему настройку языка документа.
- Нажмите Создать.
- Новый индекс появится в списке индексов, и 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
-
В консоли Google Cloud перейдите на страницу Databases (Базы данных).
- Выберите базу данных из списка.
- В меню навигации нажмите Индексы.
- При необходимости введите название индекса.
- Перейдите в раздел Search Type (Тип поиска) и выберите Geo (2dsphere) (Гео (2dsphere)).
- Введите идентификатор коллекции.
- Настройте одно или несколько полей для индексирования.
- Задайте область запроса для индекса.
- Нажмите Создать.
Новый индекс появится в списке, и 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
-
В консоли Firebase перейдите на страницу База данных Firestore.
- Выберите базу данных из списка.
- Откройте вкладку Индексы.
- В списке индексов нажмите кнопку Ещё рядом с нужным индексом и выберите Удалить.
- Нажмите Delete Index (Удалить индекс).
gcloud CLI
Чтобы найти название индекса, используйте команду
gcloud firestore indexes composite list.gcloud firestore indexes composite list \ --database='DATABASE_ID'
Замените DATABASE_ID на идентификатор базы данных.
-
Чтобы удалить индекс, используйте команду
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 в ответе не задано, значит операция не завершена.