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

На этой странице описано, как управлять индексами. Более подробную информацию об индексах см. в разделе «Обзор индексов» .

Прежде чем начать

Прежде чем создавать индекс в 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

Создать индекс

Для создания индекса выполните следующие шаги:

API MongoDB

Для создания индекса используйте метод createIndex() . Например:

  •   db.restaurants.createIndex({"cuisine" : 1})
      
  •   db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
      
  • Поддерживается также создание индексов с помощью db.runCommand() , при этом допускается создание не более одного индекса.

      db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
      

Обратите внимание на следующие ограничения:

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

    Перейдите в базу данных Firestore.

  2. Выберите базу данных из списка баз данных.
  3. На вкладке «Индексы» нажмите «Создать индекс» .
  4. Введите идентификатор коллекции .
  5. Добавьте один или несколько путей к полям и выберите для каждого из них параметр индекса.
  6. Выберите вариант наличия поля: неразреженный или разреженный.
  7. При желании можно задать параметр многоключевого индекса .
  8. Нажмите «Создать» .
  9. Ваш новый индекс отобразится в списке индексов, и 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 .

Терраформирование

Используйте ресурс 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

Создать текстовый указатель

Создайте текстовый индекс, если хотите выполнять текстовый поиск определенных строк в коллекции.

Для создания текстового указателя для вашей коллекции выполните следующие шаги:

API MongoDB

Для создания текстового индекса используйте метод 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"
    }
  ]
})

Укажите язык по умолчанию

При желании вы также можете указать язык по умолчанию или путь к полю в документе, которое будет содержать язык по умолчанию.

В следующем примере myLanguageField указано как language_override . Когда документ в коллекции cities содержит поле с именем myLanguageField , значение этого поля используется для определения языка индексации поля country для данного конкретного документа. Это значение переопределяет язык по умолчанию — french .

db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
  • Язык можно ввести либо в виде его полного названия ( english ), либо в виде двухбуквенного кода языка ISO ( en ).
  • Если язык по умолчанию не указан, Cloud Firestore будет использовать английский язык.
  • Поле «Переопределение языка» должно быть полем верхнего уровня. Если оно не задано, поле «Переопределение языка» по умолчанию будет иметь значение language .
  • Если вы установите в качестве языка по умолчанию null символ, то Cloud Firestore не будет использовать ни одно поле для переопределения языка.

Разверните список, чтобы увидеть список поддерживаемых языков.

Языковой код Название языка
"унд" Автоматическое определение
"аф" африкаанс
"ак" Акан
"квадрат" албанский
"являюсь" амхарский
"ар" арабский
"hy" армянский
"аз" азербайджанский
"Евросоюз" Баскский
"быть" белорусский
"бн" Бенгальский
"бс" боснийский
"бг" болгарский
"мой" бирманский
"ка" каталанский
"ceb" Себуано
"хр" чероки
"ж" китайский
"ж-Хант" Китайский_Традиционный
"hr" хорватский
"cs" чешский
"да" датский
"нл" Голландский
"ен" Английский
"eo" эсперанто
"эт" эстонский
"фил" филиппинский
"фи" финский
"фр" Французский
"гл" галисийский
"ка" грузинский
"де" немецкий
"эл" греческий
"гу" гуджарати
"ht" гаитянский креольский
"ха" Хауса
"хау" гавайский
"iw" иврит
"привет" хинди
"хмн" хмонг
"ху" венгерский
"является" исландский
"иг" Игбо
"идентификатор" индонезийский
"га" Ирландский
"это" итальянский
"да" японский
"jv" яванский
"кн" Каннада
"кк" казахский
"км" кхмерский
"ко" корейский
"ло" Лао
"ла" латинский
"lv" латышский
"лт" литовский
"фунт" люксембургский
"мк" македонский
"мг" малагасийский
"РС" малайский
"мл" Малаялам
"мт" мальтийский
"ми" маори
"Мистер" маратхи
"mfe" Морисьен
"мн" монгольский
"sr-ME" сербский_Черногория
"не" непальский
"нет" норвежский
"нью-йоркский" Ньянджа
"или" Одиа
"фа" персидский
"пл" польский
"пт-БР" Португальская Бразилия
"пт-ПТ" Португальская_Португалия
"па" Пенджаби
"ро" румынский
"ру" Русский
"gd" шотландский гэльский
"ср" сербский
"ст" Южный Сото
"си" сингальский
"ск" словацкий
"сл" словенский
"так" сомалийский
"es" испанский
"су" сунданский
"sw" суахили
"св" шведский
"тг" Таджик
"та" тамильский
"те" телугу
"th" Тайский
"тр" турецкий
"uk" украинский
"ур" урду
"уз" узбекский
"vi" вьетнамский
"ци" валлийский
"и" идиш
"йо" Йоруба
"зу" зулу

Разделение текстового указателя

Вы также можете разделить свой индекс на разделы, используя поле, чтобы фильтровать запросы по определенному значению поля. Такая конфигурация позволяет выполнять более производительные запросы, если вам всегда необходимо фильтровать определенное поле в индексе, к которому вы обращаетесь.

Для создания индекса с разделом настройте поле firestoreOptions следующим образом:

db.runCommand({
  createIndexes: "cities",
  indexes: [
    {
      key: { "country": "text", "food": "text"},
      name: "country_text_food_text"
      firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
    }
  ]
})

Где:

  • PARTITIONED_FIELD — это имя поля, используемого для разделения данных. Это значение должно быть строкой и ссылаться на поле верхнего уровня. При выполнении запроса к разделенному индексу можно фильтровать результаты на основе значения этого поля. Например, можно разделить индекс по city . Если в текстовом индексе определено поле city , пользователи смогут выполнять запросы к конкретному городу.

    Раздел должен содержать только одно поле. Если вы разделяете индекс, то можете выполнять только запросы, в которых указано поле, для которого был создан раздел.

Ограничения

Консоль Firebase

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

    Перейдите в базу данных Firestore.

  2. Выберите базу данных из списка баз данных.

  3. На вкладке «Индексы» нажмите «Создать индекс» .

  4. Введите идентификатор коллекции .

  5. Добавьте один или несколько путей к полям и выберите для каждого из них параметр индекса.

  6. Нажмите «Создать» .

  7. Ваш новый индекс отобразится в списке индексов, и начнутся операции, совместимые с MongoDB. После создания индекса рядом с ним появится зеленая галочка. Если индекс не создан, см. раздел «Ошибки построения индекса» для получения информации о возможных причинах.

Создайте индекс 2dsphere.

Создайте индекс в формате 2dsphere для выполнения геопространственных запросов и поиска документов, существующих в определенном диапазоне от заданных долготы и широты.

Для создания индекса 2dsphere для вашей коллекции выполните следующие шаги:

API MongoDB

Для создания индекса используйте метод 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"
    }
  ]
})

Разбить индекс двумерной сферы

Вы также можете разделить свой индекс на разделы, используя поле, чтобы фильтровать запросы по определенному значению поля. Такая конфигурация позволяет выполнять более производительные запросы, если вам всегда необходимо фильтровать определенное поле в индексе, к которому вы обращаетесь.

Для создания индекса с разделом настройте поле firestoreOptions следующим образом:

db.runCommand({
  createIndexes: "restaurants",
  indexes: [
    {
      key: { "location": "2dsphere", "region": "2dsphere" },
      name: "location_2dsphere_region_2dsphere"
      firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
    }
  ]
})

Где:

  • PARTITIONED_FIELD — это имя поля, используемого для разделения индекса на разделы. При выполнении запроса к разделенному индексу вы можете фильтровать результаты на основе значения этого поля. Например, если ваш индекс содержит поле region для региональных местоположений, вы можете разделить индекс по region , чтобы пользователи могли выполнять запросы к ресторанам в своем регионе.

    Если вы создаёте секционированный индекс, то сможете выполнять только те запросы, в которых указано секционированное поле.

Ограничения

Консоль Firebase

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

    Перейдите в базу данных Firestore.

  2. Выберите базу данных из списка баз данных.

  3. На вкладке «Индексы» нажмите «Создать индекс» .

  4. Введите идентификатор коллекции .

  5. Добавьте один или несколько путей к полям и выберите для каждого из них параметр индекса.

  6. Нажмите «Создать» .

  7. Ваш новый индекс отобразится в списке индексов, и начнутся операции, совместимые с MongoDB. После создания индекса рядом с ним появится зеленая галочка. Если индекс не создан, см. раздел «Ошибки построения индекса» для получения информации о возможных причинах.

Удалить индекс

Для удаления индекса выполните следующие действия:

API MongoDB

Для удаления индекса используйте метод dropIndex() . Например:

Удаление индекса по имени индекса

db.restaurants.dropIndex("cuisine_index")

Удаление индекса с помощью определения индекса

db.restaurants.dropIndex({"cuisine" : 1})
Консоль Firebase
  1. В консоли Firebase перейдите на страницу базы данных Firestore .

    Перейдите в базу данных Firestore.

  2. Выберите базу данных из списка баз данных.
  3. Перейдите на вкладку «Указатели» .
  4. В списке индексов выберите «Удалить» с помощью кнопки «Дополнительно» для индекса, который вы хотите удалить.
  5. Нажмите «Удалить индекс» .
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 не задано в ответе, значит, операция не завершена.