На этой странице описано, как управлять индексами. Подробнее об индексах…
Подготовка
Чтобы создать индекс в Cloud Firestore, вам должна быть назначена одна из следующих ролей:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
Подробнее о том, как предоставить роль… Подробнее о Cloud Firestoreролях и связанных с ними разрешениях…
Если вы определили специальные роли, назначьте все перечисленные ниже разрешения для создания индексов.
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
Как создать индекс
Чтобы создать индекс, выполните следующие действия:
MongoDB API
Чтобы создать индекс, используйте метод createIndex(). Пример:
-
db.restaurants.createIndex({"cuisine" : 1})
-
db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
-
Создание индекса с помощью
db.runCommand()также поддерживается максимум с одним индексом.db.runCommand({"createIndexes":"restaurant", "indexes": [{"key": {"cuisine":1}, "name": "cuisine_index"}]})
Обратите внимание на следующие ограничения:
- В одном запросе можно создать только один индекс.
db.collection.createIndexes()не поддерживается. - В журналах аудита для создания индекса с помощью MongoDB API используется название метода
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Поддерживаемые варианты индексов описаны в разделе Индексы и их свойства.
Консоль Firebase
-
В консоли Firebase перейдите на страницу База данных Firestore.
- Выберите базу данных из списка.
- На вкладке Индексы нажмите Создать индекс.
- Введите идентификатор коллекции.
- Добавьте один или несколько путей к полям и выберите вариант индекса для каждого из них.
- Выберите вариант наличия поля: разреженное или неразреженное.
- При необходимости можно задать параметр multikey index.
- Нажмите Создать.
- Новый индекс появится в списке индексов, и Cloud Firestore начнет его создавать. Когда индекс будет создан, вы увидите зеленую галочку рядом с ним. Если индекс не создан, ознакомьтесь с возможными причинами в разделе Ошибки при создании индекса.
gcloud CLI
Чтобы создать индекс, используйте команду gcloud firestore indexes composite create. Задайте для параметра api-scope значение 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
Замените следующее:
- 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.
Чтобы создать индекс с несколькими ключами, добавьте флаг --multikey.
Чтобы создать уникальный индекс, добавьте флаг --unique.
Terraform
Используйте ресурс google_firestore_index и задайте для api_scope значение MONGODB_COMPATIBLE_API, а для query_scope – 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" }
Замените следующее:
- DATABASE_ID – идентификатор выбранной базы данных.
- COLLECTION – название коллекции для индексирования.
- FIELD_PATH – название поля для индексирования.
- ORDER:
ASCENDINGилиDESCENDING. - DENSITY:
SPARSE_ANYилиDENSE.
Как создать текстовый индекс
Создайте текстовый индекс, если хотите выполнять текстовый поиск по определенным строкам в коллекции.
Чтобы создать текстовый индекс для коллекции, выполните следующие действия:
MongoDB API
Чтобы создать текстовый индекс, используйте метод createIndex().
В следующем примере, когда документ записывается в коллекцию cities с заполненными полями country или food, эти поля индексируются для целей поиска.
db.cities.createIndex({"country": "text", "food": "text"})
Поле должно быть строкой или массивом строк, которые нужно проиндексировать.
Индексы массивов не индексируются для поиска. В результате индексирование a.1.b приведет к индексированию something в {a: {1: {b: something}}}, но не в {a: [one, {b: something}]}.
Вы также можете создавать индексы с помощью db.runCommand(). В одной коллекции может быть только один текстовый индекс, но в одной базе данных db.runCommand() можно создать несколько индексов разных типов. В примере ниже для создания текстового индекса используется db.runCommand().
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text" },
name: "country_text_food_text"
}
]
})
Укажите язык по умолчанию
Вы также можете указать язык по умолчанию или путь к полю в документе, которое будет содержать язык по умолчанию.
В примере ниже в качестве language_override указано значение myLanguageField. Если документ в коллекции cities содержит поле с названием myLanguageField, значение этого поля используется для определения языка индексирования поля country для этого конкретного документа. Это значение переопределяет язык по умолчанию (french).
db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
- Язык можно указать в виде полного названия (
english) или двухбуквенного кода ISO (en). - Если язык по умолчанию не задан, то Cloud Firestore по умолчанию использует английский.
- Поле переопределения языка должно быть полем верхнего уровня. Если поле не заполнено, по умолчанию используется значение
language. - Если в качестве языка по умолчанию вы укажете символ
null, то Cloud Firestore не будет использовать никакое поле для переопределения языка.
Развернуть список поддерживаемых языков
| Код языка | Название языка |
|---|---|
| "und" | Автоопределение |
| "af" | Африкаанс |
| "ak" | Акан |
| "sq" | Албанский |
| "am" | Амхарский |
| "ar" | Арабский |
| "hy" | Армянский |
| "az" | Азербайджанский |
| "eu" | Баскский |
| "be" | Белорусский |
| "bn" | Бенгальский |
| "bs" | Боснийский |
| "bg" | Болгарский |
| "my" | Бирманский |
| "ca" | Каталанский |
| "ceb" | Себуанский |
| "chr" | Чероки |
| "zh" | Китайский |
| "zh-Hant" | Китайский (традиционный) |
| "hr" | Хорватский |
| "cs" | Чешский |
| "da" | Датский |
| "nl" | Нидерландский |
| "ru" | Английский |
| "eo" | Эсперанто |
| "et" | Эстонский |
| "fil" | Филиппинский |
| "fi" | Финский |
| "ru" | Французский |
| "gl" | Галицийский |
| "ka" | Грузинский |
| "de" | Немецкий |
| "el" | Греческий |
| "gu" | Гуджарати |
| "ht" | Гаитянский креольский |
| "ха" | Хауса |
| "haw" | Гавайская |
| "iw" | Иврит |
| "Здравствуйте" | Хинди |
| "hmn" | хмонг |
| "hu" | Венгерский |
| "is" | Исландский |
| "ig" | игбо |
| "id" | Индонезийский |
| "ga" | Ирландский |
| "it" | Итальянский |
| "ja" | Японский |
| "jv" | Яванский |
| "kn" | Каннада |
| "kk" | Казахский |
| "km" | Кхмерский |
| "ko" | Корейский |
| "lo" | Лаосский |
| "la" | Латинский |
| "lv" | Латышский |
| "lt" | Литовский |
| "lb" | Люксембургский |
| "mk" | Македонский |
| "мг" | Малагасийский |
| "ms" | Малайский |
| "ml" | Малаялам |
| "mt" | Мальтийский |
| "mi" | Маори |
| "mr" | Маратхи |
| "mfe" | Маврикийский креольский |
| "mn" | Монгольский |
| "sr-ME" | Serbian_Montenegro |
| "ne" | Непали |
| "нет" | Норвежский |
| "ny" | Ньянджа |
| "или" | Ория |
| "fa" | Персидское происхождение |
| "pl" | Польский |
| "pt-BR" | Португальский (Бразилия) |
| "pt-PT" | Португальский (Португалия) |
| "pa" | Пенджабский |
| "ro" | Румынский |
| "ru" | Русский |
| "gd" | Шотландский (гэльский) |
| "sr" | Сербский |
| "st" | Южный сото |
| "si" | Сингальский |
| "sk" | Словацкий |
| "sl" | Словенский |
| "so" | Сомали |
| "es" | Испанский |
| "su" | Сунданский |
| "sw" | Суахили |
| "sv" | Шведский |
| "tg" | Таджикский |
| "ta" | Тамильский |
| "te" | Телугу |
| "th" | Тайский |
| "tr" | Турецкий |
| "uk" | Украинский |
| "ur" | Урду |
| "uz" | Узбекский |
| "vi" | Вьетнамский |
| "cy" | Валлийский |
| "yi" | Идиш |
| "yo" | Йоруба |
| "zu" | Зулу |
Как разделить текстовый индекс
Вы также можете разделить индекс по полю, чтобы фильтровать запросы по определенному значению поля. Такая конфигурация позволяет выполнять более эффективные запросы, если вам всегда нужно фильтровать определенное поле в запрашиваемом индексе.
Чтобы создать индекс с разделом, настройте поле firestoreOptions следующим образом:
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text"},
name: "country_text_food_text"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
Место:
PARTITIONED_FIELD– название поля, используемого для разбиения. Значение должно быть строкой и относиться к полю верхнего уровня. При выполнении запроса к секционированному индексу вы можете отфильтровать результаты по значению этого поля. Например, вы можете разделить индекс, используяcity. Если в текстовом индексе определено полеcity, пользователи могут выполнять запросы по определенному городу.Раздел должен содержать только одно поле. Если вы разделите индекс, то сможете выполнять только запросы, в которых указано разделенное поле.
Ограничения
- В одном запросе можно создать только один индекс.
- В журналах аудита для создания индекса с помощью MongoDB API используется название метода
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Поддерживаемые варианты индексов описаны в статье Индексы и их свойства.
Консоль Firebase
В консоли Firebase перейдите на страницу База данных Firestore.
Выберите базу данных из списка.
На вкладке Индексы нажмите Создать индекс.
Введите идентификатор коллекции.
Добавьте один или несколько путей к полям и выберите вариант индекса для каждого из них.
Нажмите Создать.
Новый индекс появится в списке индексов, и совместимые с MongoDB операции начнут создавать ваш индекс. Когда индекс будет создан, рядом с ним появится зеленая галочка. Если индекс не создан, ознакомьтесь с возможными причинами в разделе Ошибки при создании индекса.
gcloud CLI
Чтобы создать текстовый индекс, используйте команду gcloud firestore indexes composite create. Задайте для параметра --api-scope значение mongodb-compatible-api.
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"}]}}' \ --api-scope=mongodb-compatible-api \ --search-index-options=text-language=en \ --async
Замените следующее:
- DATABASE_ID – идентификатор базы данных.
- COLLECTION_GROUP – идентификатор коллекции, которую нужно проиндексировать.
- FIELD_NAME – название поля для индексирования.
Флаг --async запускает операцию создания индекса в фоновом режиме.
Создайте индекс 2dsphere
Создайте индекс 2dsphere, чтобы выполнять геопространственные запросы и искать документы, которые находятся в определенном диапазоне от конкретной долготы и широты.
Чтобы создать индекс 2dsphere для коллекции, выполните следующие действия:
MongoDB API
Чтобы создать индекс, используйте метод createIndex(). Пример:
db.restaurants.createIndex({"location" : "2dsphere", "region": "2dsphere"})
Создание индекса с помощью db.runCommand() также поддерживается максимум с одним индексом:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
}
]
})
Как разделить индекс 2dsphere
Вы также можете разделить индекс по полю, чтобы фильтровать запросы по определенному значению поля. Такая конфигурация позволяет выполнять более эффективные запросы, если вам всегда нужно фильтровать определенное поле в запрашиваемом индексе.
Чтобы создать индекс с разделом, настройте поле firestoreOptions следующим образом:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
Место:
PARTITIONED_FIELD– название поля, используемого для разбиения. При выполнении запроса к секционированному индексу вы можете отфильтровать результаты по значению этого поля. Например, если в индексе есть полеregionдля регионов, вы можете разделить индекс по полюregion, чтобы пользователи могли искать рестораны в своем регионе.Если вы разбиваете индекс на разделы, то можете выполнять запросы только с указанием поля, по которому выполнено разбиение.
Ограничения
- В одном запросе можно создать только один индекс.
- В журналах аудита для создания индекса с помощью MongoDB API используется название метода
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Поддерживаемые варианты индексов описаны в статье Индексы и их свойства.
Консоль Firebase
В консоли Firebase перейдите на страницу База данных Firestore.
Выберите базу данных из списка.
На вкладке Индексы нажмите Создать индекс.
Введите идентификатор коллекции.
Добавьте один или несколько путей к полям и выберите вариант индекса для каждого из них.
Нажмите Создать.
Новый индекс появится в списке индексов, и совместимые с MongoDB операции начнут создавать ваш индекс. Когда индекс будет создан, рядом с ним появится зеленая галочка. Если индекс не создан, ознакомьтесь с возможными причинами в разделе Ошибки при создании индекса.
gcloud CLI
Чтобы создать индекс 2dsphere, используйте команду gcloud firestore indexes composite create. Задайте для параметра --api-scope значение mongodb-compatible-api.
gcloud firestore indexes composite create \
--database='DATABASE_ID' \
--collection-group=COLLECTION_GROUP \
--field-config=field-path=FIELD_NAME,search-config='{"geo-spec": {}}' \
--api-scope=mongodb-compatible-api \
--asyncЗамените следующее:
- DATABASE_ID – идентификатор базы данных.
- COLLECTION_GROUP – идентификатор коллекции, которую нужно проиндексировать.
- FIELD_NAME – название поля для индексирования.
Флаг --async запускает операцию создания индекса в фоновом режиме.
Как удалить индекс
Чтобы удалить индекс, выполните следующие действия:
MongoDB API
Чтобы удалить индекс, используйте метод dropIndex(). Пример:
Как удалить индекс по названию
db.restaurants.dropIndex("cuisine_index")
Как удалить индекс с помощью определения индекса
db.restaurants.dropIndex({"cuisine" : 1})
Консоль 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 в ответе не задано, значит операция не завершена.