Cloud Firestore обеспечивает высокую производительность запросов, требуя создания индекса для каждого запроса. Индексы, необходимые для самых простых запросов, создаются автоматически . По мере использования и тестирования вашего приложения Cloud Firestore генерирует сообщения об ошибках, которые помогут вам создать дополнительные индексы, необходимые вашему приложению. На этой странице описано, как управлять однопольными , составными и векторными индексами.
Создание отсутствующего индекса на основании сообщения об ошибке
Если вы попытаетесь выполнить составной запрос с условием диапазона, которое не соответствует существующему индексу, вы получите ошибку. Сообщение об ошибке содержит прямую ссылку для создания отсутствующего индекса в консоли Firebase.
Перейдите по сгенерированной ссылке в консоль Firebase, просмотрите автоматически заполненную информацию и нажмите «Создать» .
В случае, если требуется векторный индекс, в сообщении об ошибке будет указана команда Google Cloud CLI для создания отсутствующего векторного индекса. Выполните команду для создания отсутствующего индекса.
Роли и права доступа
Прежде чем создавать индекс в Cloud Firestore , убедитесь, что вам назначена одна из следующих ролей:
-
roles/datastore.owner -
roles/datastore.indexAdmin -
roles/editor -
roles/owner
Если вы определили пользовательские роли, назначьте все следующие разрешения для создания индексов:
-
datastore.indexes.create -
datastore.indexes.delete -
datastore.indexes.get -
datastore.indexes.list -
datastore.indexes.update
Используйте консоль Firebase.
Чтобы создать новый индекс вручную из консоли Firebase:

- Перейдите в раздел Cloud Firestore в консоли Firebase .
- Перейдите на вкладку «Указатели» и нажмите «Добавить указатель» .
- Введите название коллекции и укажите поля, по которым вы хотите упорядочить индекс.
- Нажмите «Создать» .
Поля индекса должны соответствовать ограничениям на пути к полям .
Создание индексов может занять несколько минут, в зависимости от размера запроса. После создания индексов и их состояния вы можете увидеть в разделе «Составные индексы». Если процесс создания индексов еще не завершен, в консоли Firebase отобразится индикатор выполнения.
Удалить индексы
Чтобы удалить индекс:
- Перейдите в раздел Cloud Firestore в консоли Firebase .
- Перейдите на вкладку «Указатели» .
- Наведите курсор на индекс, который хотите удалить, и выберите «Удалить» в контекстном меню.
- Подтвердите удаление, нажав кнопку «Удалить» в окне уведомления.
Используйте Firebase CLI
Вы также можете развернуть индексы с помощью Firebase CLI . Для начала выполните команду firebase init firestore в каталоге вашего проекта. Во время настройки Firebase CLI сгенерирует JSON-файл с индексами по умолчанию в правильном формате. Отредактируйте файл, чтобы добавить больше индексов, и разверните его с помощью команды firebase deploy .
Чтобы развернуть только индексы и правила Cloud Firestore , добавьте флаг --only firestore .
Если вы вносите изменения в индексы с помощью консоли Firebase, обязательно обновите также локальный файл индексов. См. справочник по определению индексов в формате JSON .
Используйте Terraform
Создание индексов в базе данных
Базы данных Cloud Firestore могут включать как однопольные, так и составные индексы. Вы можете отредактировать файл конфигурации Terraform, чтобы создать индекс для вашей базы данных. Однопольные и составные индексы используют разные типы ресурсов Terraform ( google_firestore_index и google_firestore_field ).
Однопольный указатель
В приведенном ниже примере конфигурационного файла Terraform создается однопольный индекс по полю name в коллекции chatrooms :
firestore.tf
resource "random_id" "variable"{
byte_length = 8
}
resource "google_firestore_field" "single-index" {
project = "project-id"
database = "database-id"
collection = "chatrooms_${random_id.variable.hex}"
field = "name"
index_config {
indexes {
order = "ASCENDING"
query_scope = "COLLECTION_GROUP"
}
indexes {
array_config = "CONTAINS"
}
}
ttl_config {}
}
- Замените project-id на идентификатор вашего проекта. Идентификаторы проектов должны быть уникальными.
- Замените database-id на идентификатор вашей базы данных.
Составной индекс
В приведенном ниже примере конфигурационного файла Terraform создается составной индекс для комбинации поля name и поля description в коллекции chatrooms :
firestore.tf
resource "google_firestore_index" "composite-index" {
project = "project-id"
database = "database-id"
collection = "chatrooms"
fields {
field_path = "name"
order = "ASCENDING"
}
fields {
field_path = "description"
order = "DESCENDING"
}
}
- Замените project-id на идентификатор вашего проекта. Идентификаторы проектов должны быть уникальными.
- Замените database-id на идентификатор вашей базы данных.
Векторный индекс
В приведенном ниже примере конфигурационного файла Terraform создается векторный индекс по полю embedding в коллекции chatrooms :
firestore.tf
resource "google_firestore_index" "vector-index" {
project = "project-id"
database = "database-id"
collection = "chatrooms"
fields {
field_path = "__name__"
order = "ASCENDING"
}
fields {
field_path = "embedding"
vector_config {
dimension = 128
flat {}
}
}
}
- Замените project-id на идентификатор вашего проекта. Идентификаторы проектов должны быть уникальными.
- Замените database-id на идентификатор вашей базы данных.
время построения индекса
Для создания индекса Cloud Firestore необходимо сначала настроить индекс, а затем заполнить его существующими данными. Время создания индекса — это сумма времени настройки и времени заполнения:
Настройка индекса занимает несколько минут. Минимальное время построения индекса составляет несколько минут, даже для пустой базы данных.
Время заполнения индекса зависит от объема существующих данных, которые должны быть включены в новый индекс. Чем больше значений полей соответствует определению индекса, тем дольше будет занимать заполнение индекса.
Создание индексов — это длительные операции .
После запуска процесса создания индекса Cloud Firestore присваивает операции уникальное имя. Имена операций имеют префикс projects/[PROJECT_ID]/databases/(default)/operations/ , например:
projects/project-id/databases/(default)/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 не задано в ответе, то его значение равно false . Не следует полагаться на наличие значения done для операций, находящихся в процессе выполнения.
ошибки при построении индекса
При управлении составными индексами и исключениями для индексов по одному полю могут возникать ошибки построения индексов. Операция индексирования может завершиться неудачей, если Cloud Firestore обнаружит проблему с индексируемыми данными. Чаще всего это означает, что вы достигли лимита индекса . Например, операция могла достичь максимального количества записей индекса на документ.
Если создание индекса не удается, вы увидите сообщение об ошибке в консоли. После того, как вы убедитесь, что не превышаете лимиты индекса , повторите операцию создания индекса.