インデックスを管理

このページでは、インデックスを管理する方法について説明します。インデックスの詳細については、インデックスの概要をご覧ください。

始める前に

MongoDB 互換の Firestore でインデックスを作成する前に、自身に次のいずれかのロールが割り当てられていることを確認してください。

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

ロールを付与するには、単一のロールを付与するをご覧ください。 Firestore のロールと関連する権限の詳細については、事前定義ロールをご覧ください。

カスタムロールを定義している場合、インデックスを作成するには次のすべての権限を割り当ててください。

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

インデックスの作成

インデックスを作成するには、次の操作を行います。

MongoDB API

createIndex() メソッドを使用してインスタンスを作成します。次に例を示します。

  •   db.restaurants.createIndex({"cuisine" : 1})
      
  •   db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
      
  • 最大 1 つのインデックスに限り、db.runCommand() を使用したインデックス作成もサポートされています。

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

次の制約があります。

  • リクエストごとに作成できるインデックスは 1 つだけです。db.collection.createIndexes() はサポートされていません。
  • MongoDB API を使用したインデックス作成の監査ログでは、メソッド名 google.firestore.admin.v1.FirestoreAdmin.CreateIndex が使用されます。
  • サポートされているインデックス オプションについては、インデックスとインデックス プロパティをご覧ください。
Google Cloud コンソール
  1. Google Cloud コンソールで、[データベース] ページに移動します。

    [データベース] に移動

  2. データベースのリストからデータベースを選択します。
  3. ナビゲーション メニューで、[インデックス] をクリックします。
  4. [インデックスを作成] をクリックします。
  5. コレクション ID を入力します。
  6. 1 つ以上のフィールドパスを追加し、それぞれにインデックス オプションを選択します。
  7. フィールド プレゼンス オプション(非スパースまたはスパース)を選択します。
  8. 必要に応じて、マルチキー インデックス オプションまたは一意インデックス オプションを設定します。
  9. [作成] をクリックします。
  10. 新しいインデックスがインデックスのリストに表示され、MongoDB 互換の Firestore がインデックスの作成を開始します。インデックスが作成されると、インデックスの横に緑色のチェックマークが表示されます。インデックスが作成されていない場合は、考えられる原因をインデックス構築エラーで確認してください。
gcloud CLI

インデックスを作成するには、gcloud firestore indexes composite create コマンドを使用します。api-scopemongodb-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: データベース 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_scopeMONGODB_COMPATIBLE_API に、query_scopeCOLLECTION_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: 選択したデータベースのデータベース ID
  • COLLECTION: インデックスを作成するコレクションの名前
  • FIELD_PATH: インデックスを作成するフィールドの名前
  • ORDER: ASCENDINGDESCENDING のいずれか
  • DENSITY: SPARSE_ANYDENSE のいずれか

テキスト インデックスを作成する

コレクション内の特定の文字列をテキスト検索する場合は、テキスト インデックスを作成します。

コレクションのテキスト インデックスを作成するには、次の操作を行います。

MongoDB API

createIndex() メソッドを使用してテキスト インデックスを作成します。次の例では、country フィールドまたは food フィールドが入力された状態でドキュメントが cities コレクションに書き込まれると、これらのフィールドが検索用にインデックスに登録されます。

db.cities.createIndex({"country": "text", "food": "text"})

インデックス登録するフィールドは、文字列または文字列の配列である必要があります。配列インデックスは検索インデックスに登録されません。その結果、a.1.b のインデックス登録では、{a: {1: {b: something}}}something はインデックス登録されますが、{a: [one, {b: something}]}something はインデックス登録されません。

db.runCommand() を使用してインデックスを作成することもできます。コレクションごとに作成できるテキスト インデックスは 1 つのみですが、1 つの db.runCommand() に異なるタイプのインデックスを複数作成できます。次の例では、db.runCommand() を使用してテキスト インデックスを作成します。

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

デフォルトの言語を指定する

必要に応じて、デフォルト言語、またはデフォルト言語を含むドキュメント内のフィールド パスを指定することもできます。

次の例では、myLanguageFieldlanguage_override として指定されています。cities コレクション内のドキュメントに myLanguageField という名前のフィールドが含まれている場合、そのフィールドの値は、その特定のドキュメントの country フィールドのインデックス登録に使用する言語を決定するために使用されます。この値は、french のデフォルト言語をオーバーライドします。

db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
  • 言語は、正式名(english)または 2 文字の ISO 言語コード(en)で入力できます。
  • デフォルト言語が設定されていない場合、Firestore はデフォルトで英語を使用します。
  • 言語オーバーライド フィールドはトップレベル フィールドである必要があります。設定しなかった場合、言語オーバーライド フィールドはデフォルトで language になります。
  • デフォルトの言語を null 文字に設定すると、MongoDB 互換の 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" オランダ語
「en」 英語
「eo」 エスペラント語
「et」 エストニア語
「fil」 フィリピン語
「fi」 フィンランド語
"fr" フランス語
"gl" ガリシア語
"ka" ジョージア語
「de」 ドイツ語
「el」 ギリシャ語
"gu" グジャラート語
"ht" Haitian_Creole
"ha" ハウサ語
"haw" ハワイ語
"iw" ヘブライ語
「こんにちは」 ヒンディー語
「hmn」 モン語
"hu" ハンガリー語
"is" アイスランド語
"ig" イボ語
"id" インドネシア語
"ga" アイルランド語
"it" イタリア語
「ja」 日本語
「jv」 ジャワ語
"kn" カンナダ語
"kk" カザフ語
"km" クメール語
「ko」 韓国語
"lo" ラオ語
「la」 ラテン語
"lv" ラトビア語
"lt" リトアニア語
"lb" ルクセンブルク語
"mk" マケドニア語
"mg" マラガシ語
"ms" マレー語
"ml" マラヤーラム語
「mt」 マルタ語
"mi" マオリ語
「mr」 マラーティー語
"mfe" モーリシャス語
「mn」 モンゴル語
"sr-ME" Serbian_Montenegro
"ne" ネパール語
"no" ノルウェー語
"ny" ニャンジャ語
「または」 オディア語
"fa" ペルシャ語
"pl" ポーランド語
"pt-BR" Portuguese_Brazil
"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 フィールドが定義されている場合、ユーザーは特定の都市に対してクエリを実行できます。

    パーティションは 1 つのフィールドのみにする必要があります。インデックスをパーティション分割すると、パーティション分割されたフィールドが指定されているクエリのみを実行できます。

制限事項

  • リクエストごとに作成できるインデックスは 1 つだけです。
  • MongoDB API を使用したインデックス作成の監査ログでは、メソッド名 google.firestore.admin.v1.FirestoreAdmin.CreateIndex が使用されます。
  • サポートされているインデックス オプションについては、インデックスとインデックス プロパティをご覧ください。

Google Cloud コンソール

  1. Google Cloud コンソールで、[データベース] ページに移動します。

    [データベース] に移動

  2. データベースのリストからデータベースを選択します。

  3. ナビゲーション メニューで、[インデックス] をクリックします。

  4. [インデックスを作成] をクリックし、[検索インデックスを作成] をクリックします。

  5. (省略可)インデックスの名前を入力します。

  6. [検索タイプ] に移動し、[テキスト] を選択します。

  7. コレクション ID を入力します。

  8. フィールド パスを 1 つ以上入力します。

  9. 省略可: デフォルトの言語を指定します。

    たとえば、言語のオーバーライド パスを myLanguageField に設定します。コレクション内のドキュメントに myLanguageField という名前のフィールドが含まれている場合、そのフィールドの値は、インデックス内で定義されたフィールドのインデックス登録に使用する言語を決定するために使用されます。この値は、インデックスのデフォルト言語をオーバーライドします。

  10. [作成] をクリックします。

  11. 新しいインデックスがインデックスのリストに表示され、MongoDB 互換のオペレーションがインデックスの作成を開始します。インデックスが作成されると、インデックスの横に緑色のチェックマークが表示されます。インデックスが作成されていない場合は、考えられる原因をインデックス構築エラーで確認してください。

2dsphere インデックスを作成する

2dsphere インデックスを作成して、地理空間クエリを実行し、特定の経度と緯度から一定の範囲内にあるドキュメントを検索します。

コレクションの 2dsphere インデックスを作成するには、次の操作を行います。

MongoDB API

createIndex() メソッドを使用してインデックスを作成します。次に例を示します。

db.restaurants.createIndex({"location" : "2dsphere", "region": "2dsphere"})

最大 1 つのインデックスに限り、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 を使用してインデックスをパーティショニングすると、ユーザーは自分の地域のレストランに対してクエリを実行できます。

    インデックスをパーティション分割すると、パーティション分割されたフィールドが指定されているクエリのみを実行できます。

制限事項

  • リクエストごとに作成できるインデックスは 1 つだけです。
  • MongoDB API を使用したインデックス作成の監査ログでは、メソッド名 google.firestore.admin.v1.FirestoreAdmin.CreateIndex が使用されます。
  • サポートされているインデックス オプションについては、インデックスとインデックス プロパティをご覧ください。

Google Cloud コンソール

  1. Google Cloud コンソールで、[データベース] ページに移動します。

    [データベース] に移動

  2. データベースのリストからデータベースを選択します。

  3. ナビゲーション メニューで、[インデックス] をクリックします。

  4. [インデックスを作成] をクリックし、[検索インデックスを作成] をクリックします。

  5. コレクション ID を入力します。

  6. [検索タイプ] に移動し、[Geo(2dsphere)] を選択します。

  7. [作成] をクリックします。

  8. 新しいインデックスがインデックスのリストに表示され、MongoDB 互換のオペレーションがインデックスの作成を開始します。インデックスが作成されると、インデックスの横に緑色のチェックマークが表示されます。インデックスが作成されていない場合は、考えられる原因をインデックス構築エラーで確認してください。

インデックスを削除する

インデックスを削除するには、次の操作を行います。

MongoDB API

dropIndex() メソッドを使用して、インデックスを削除します。次に例を示します。

インデックス名を使用してインデックスを削除する

db.restaurants.dropIndex("cuisine_index")

インデックス定義を使用してインデックスを削除する

db.restaurants.dropIndex({"cuisine" : 1})
Google Cloud コンソール
  1. Google Cloud コンソールで、[データベース] ページに移動します。

    [データベース] に移動

  2. データベースのリストからデータベースを選択します。
  3. ナビゲーション メニューで、[インデックス] をクリックします。
  4. インデックスのリストで、削除するインデックスの [その他] ボタン から [削除] を選択します。
  5. [インデックスを削除] をクリックします。
gcloud CLI
  1. インデックスの名前を確認するには、gcloud firestore indexes composite list コマンドを使用します。

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

    DATABASE_ID をデータベース ID に置き換えます。

  2. インデックスを削除するには、gcloud firestore indexes composite delete コマンドを使用します。

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

    以下を置き換えます。

    • INDEX_NAME: インデックスの名前
    • DATABASE_ID: データベース ID

インデックスの構築時間

インデックスを構築するには、MongoDB 互換の Firestore でインデックスを作成し、既存のデータでインデックス エントリをバックフィルする必要があります。インデックスの作成に必要な時間は、次の要素によって決まります。

  • インデックスの最小構築時間は、空のデータベースであっても数分です。

  • インデックス エントリのバックフィルに必要な時間は、新しいインデックスに既存のデータがどの程度存在するかによって異なります。インデックス定義に一致するフィールド値が多いほど、インデックス エントリのバックフィルにかかる時間が長くなります。

長時間実行オペレーションを管理する

インデックスの構築は長時間実行オペレーションになります。以降のセクションでは、インデックスの長時間実行オペレーションを操作する方法について説明します。

インデックスの作成を開始すると、MongoDB 互換の 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

オペレーションのステータスを確認する

すべての長時間実行オペレーションを一覧表示する代わりに、1 つのオペレーションの詳細を一覧表示できます。

gcloud firestore operations describe operation-name

完了時間の見積もり

オペレーションを実行すると、state フィールドの値で、オペレーション全体のステータスが確認できます。

長時間実行オペレーションのステータスをリクエストすると、workEstimatedworkCompleted の指標も合わせて返されます。workEstimated には、オペレーションで処理される推定の合計ドキュメント数が表示されます。workCompleted には、これまでに処理されたドキュメント数が表示されます。オペレーションが完了すると、workCompleted には実際に処理されたドキュメントの合計数が反映されます。これは workEstimated の値とは異なる場合があります。

オペレーションの進行状況を推定するには、workCompletedworkEstimated で割ります。

インデックス作成の進行状況の例を次に示します。

{
  "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 フィールドがレスポンスに設定されていない場合、オペレーションは完了していません。