Atlas Search インデックスを作成する際、次の方法でインデックス化するフィールドを指定できます。
動的マッピング: Atlas Search がサポートされているタイプのすべてのフィールドを自動的にインデックス化できるようにします。
静的マッピング: インデックスを作成するフィールドを指定できます。
データ型の制限事項
Atlas Search はデフォルトで、レプリカセットまたは単一のシャードで、インデックス オブジェクトが 21 億を超えるインデックスについて、変更のレプリケーションを停止します。この場合、インデックス作成されたドキュメントまたはネストされた ,embeddedDocument は 1 つのオブジェクトとして数えられます。つまり、インデックスはクエリ可能ですが、古い結果が返される可能性があります。
21 億オブジェクトを超える可能性のあるフィールドにインデックスを付ける予定である場合、numPartitions を使用するか、 クラスターをシャーディングします。
フィールド名の先頭にドル記号($)が含まれるフィールドにはインデックスを付けられません。
構文
動的マッピングを使用するには、インデックス定義で mappings.dynamic を true に設定します。また、個々のフィールドには、mappings.fields で該当フィールドの名前、データ型、その他の設定オプションを指定することもできます。フィールドはどのような順序でも指定できます。
1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { // Optional, use this to configure individual fields 5 "<field-name>": { 6 "type": "<field-type>", 7 ... 8 }, 9 ... 10 } 11 } 12 }
静的マッピングを使用するには、mappings.dynamic を false に設定し、mappings.fields にインデックスを作成する各フィールドのフィールド名、データ型、その他の構成オプションを指定します。フィールドはどのような順序でも指定できます。
mappings.dynamic フィールドを省略すると、デフォルトで false になります。
1 { 2 "mappings": { 3 "dynamic": false, // Optional, if omitted defaults to "false" 4 "fields": { 5 "<field-name>": { 6 "type": "<field-type>", 7 ... 8 }, 9 ... 10 } 11 } 12 }
複数のデータ型にわたる多形データを含むフィールドについては、そのフィールドで各データ型に 1 つずつフィールド定義配列を指定することで、インデックスを作成できます。
1 { 2 "mappings": { 3 "dynamic": <boolean>, 4 "fields": { 5 "<field-name>": [ 6 { 7 "type": "<field-type>", 8 ... 9 }, 10 { 11 "type": "<field-type>", 12 ... 13 }, 14 ... 15 ], 16 ... 17 }, 18 ... 19 } 20 }
静的マッピングと動的マッピング
静的マッピングと動的マッピングを使用して、Atlas Search がコレクション内のすべての動的にインデックス付け可能なフィールドを自動的にインデックス化する必要があるかどうか指定できます。
ダイナミックマッピング
コレクション内のサポートされているタイプのすべてのフィールドに自動的にインデックスを作成するには、動的マッピングを使用します。動的マッピングの使用は、スキーマが定期的に変更される場合や不明な場合、または Atlas Search を試用中の場合に限定してください。動的にマッピングされたインデックスは、静的にマッピングされたインデックスよりも多くのディスク領域を占有し、パフォーマンスを低下させる可能性があります。
多形データが含まれるフィールドを動的にインデックス化すると、Atlas Search は、データに対応する動的にインデックス付け可能なすべてのフィールドタイプとしてフィールドを自動的にインデックス化します。自動的にインデックスを作成しない種類のデータがフィールドに含まれている場合、Atlas Search はそのデータのインデックスを作成しません。
Atlas Search は、検出されたデータ型のデフォルト設定を使用して、ドキュメント内のすべてのフィールドに動的にインデックスを作成します。Atlas Search は、ドキュメントの下にあるすべてのネストされたドキュメントを動的にインデックス化します。ただし、dynamic を false に設定して明示的にオーバーライドしない限り、インデックス化されます。
動的インデックスをサポートするデータ型については、以下の「データ型」セクションを参照してください。
静的マッピング
静的マッピングは、動的にインデックスを作成しないフィールドにインデックス オプションを設定したり、1 つのフィールドをインデックス内の他のフィールドと独立して構成したりするために使用します。静的マッピングを使用する場合、Atlas Search は mappings.fields で指定したフィールドのみをインデックス化します。
多形データを含むフィールドを静的にインデックスした場合、Atlas Search でインデックスが作成されるドキュメントは、そのフィールドのインデックス定義で指定されるマッピングに対応するもののみに限定され、そのフィールドのインデックス定義で指定されたデータ型と一致しないドキュメントはインデックス化されません。
ネストされたフィールドのインデックスを定義する場合、そのネストされたフィールドの各親フィールドを対象にマッピングを定義する必要があります。ドット表記を使用して、ネストされたフィールドに静的にインデックスを作成することはできません。例については、以下の「例」または「複合マッピングの例」セクションを参照してください。
データ型
Atlas Search では次の BSON データ型をサポートしていません。
Decimal128
JavaScript コード(スコープ付き)
Max key
Min key
正規表現
タイムスタンプ
Atlas Search では、string 型のフィールドは自動的に mongot 上に保存されます。Atlas Search ではインデックス定義で [Atlas Search インデックスで保存されたソースフィールドを定義する] オプションを使用して、すべてのサポートされるデータ型のフィールドを保存できます。mongot と Atlas Search のノードアーキテクチャについては、「Atlas Search 配置オプション」を参照してください。
次の表は、サポートされている BSON データ型と、BSON データ型のインデックス作成に使用できる Atlas Search フィールド型を示しています。この表には、動的マッピングを有効にしたときに Atlas Search フィールド型が Atlas Search インデックスに自動的に含まれるかどうかも示されており、フィールド値をクエリするために使用できる演算子とコレクターが列挙されています。
BSON 型 | Atlas Search フィールド型 | 動的なインデックス付け | 演算子とコレクター |
|---|---|---|---|
✓ | 配列内のデータ型をサポートする演算子。 | ||
ブール値 | ✓ | ||
日付 | ✓ | ||
日付 | |||
Double | ✓ | ||
Double | |||
Double | |||
32 ビット整数 | ✓ | ||
32 ビット整数 | |||
64 ビット整数 | ✓ | ||
64 ビット整数 | |||
null | 該当なし | ✓ | |
オブジェクト | ✓ | すべての演算子 | |
オブジェクト | 埋め込みドキュメント(オブジェクトの配列用) | ||
ObjectId | ✓ | ||
文字列 | ✓ | ||
文字列 | |||
文字列 | |||
文字列 | |||
✓ |
いくつかの制限が適用されます。詳細については、配列の要素のインデックス作成方法を参照してください。
string タイプの場合、moreLikeThis 演算子および queryString 演算子は文字列の配列をサポートしていません。
Atlas Search は、静的にインデックスが付けられたフィールドと動的にインデックスが付けられたフィールドの両方の null 値を自動的にインデックス化するため、Atlas Search には null 値をインデックス化するためのフィールド タイプが含まれていません。
非推奨。
複数のデータ型としてのインデックス フィールド
フィールドを複数のタイプとしてインデックス化するには、フィールドのフィールド定義配列でタイプを定義します。
例
次の例では、フィールドを複数のタイプとしてインデックスを作成するためのフィールド定義を示しています。
1 { 2 ... 3 "mappings": { 4 "dynamic": <boolean>, 5 "fields": { 6 "<field-name>": [ 7 { 8 "type": "<field-type>", 9 ... 10 }, 11 { 12 "type": "<field-type>", 13 ... 14 }, 15 ... 16 ], 17 ... 18 }, 19 ... 20 } 21 }
例
静的マッピングの例
以下のインデックス定義例では、静的マッピングを使用しています。
デフォルトのインデックス アナライザは lucene.standard です。
デフォルトの検索アナライザは lucene.standard です。Atlas Search インデックスに格納する方法とは異なる方法でクエリ用語を解析する場合は、検索アナライザを変更できます。
インデックスは静的フィールドマッピング(
dynamic:false)を指定します。つまり、明示的に指定されていないフィールドにはインデックスが付けられません。したがって、インデックス定義には次のものが含まれます。document型である、addressフィールド。埋め込まれたサブフィールドにはcityとstateの 2 つがあります。cityサブフィールドは、クエリに対してデフォルトで lucene.simple アナライザを使用します。ignoreAboveオプションを使用すると、長さが 255 バイトを超える文字列を無視します。stateサブフィールドは、クエリに対してデフォルトで lucene.english アナライザを使用します。string型である、companyフィールド。クエリにはデフォルトで lucene.whitespace アナライザが使用されます。クエリにデフォルトで lucene.french アナライザを使用するmySecondaryAnalyzerという名前のmultiアナライザがあります。文字列の配列である
employeesフィールド。クエリにはデフォルトで lucene.standard アナライザが使用されます。配列のインデックス作成において、Atlas Search では配列要素のデータ型のみが必要です。インデックス定義でデータが配列に含まれていることを指定する必要はありません。
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": false, "fields": { "address": { "type": "document", "fields": { "city": { "type": "string", "analyzer": "lucene.simple", "ignoreAbove": 255 }, "state": { "type": "string", "analyzer": "lucene.english" } } }, "company": { "type": "string", "analyzer": "lucene.whitespace", "multi": { "mySecondaryAnalyzer": { "type": "string", "analyzer": "lucene.french" } } }, "employees": { "type": "string", "analyzer": "lucene.standard" } } } }
複合マッピングの例
次のインデックス定義の例では、静的マッピングと動的マッピングの両方を使用します。
デフォルトのインデックス アナライザは lucene.standard です。
デフォルトの検索アナライザは lucene.standard です。Atlas Search インデックスに格納する方法とは異なる方法でクエリ用語を解析する場合は、検索アナライザを変更できます。
インデックスは静的フィールドマッピング(
dynamic:false)を指定します。つまり、明示的に指定されていないフィールドにはインデックスが付けられません。したがって、インデックス定義には次のものが含まれます。string型である、companyフィールド。クエリにはデフォルトで lucene.whitespace アナライザが使用されます。クエリにデフォルトで lucene.french アナライザを使用するmySecondaryAnalyzerという名前のmultiアナライザがあります。文字列の配列である
employeesフィールド。クエリにはデフォルトで lucene.standard アナライザが使用されます。document型である、addressフィールド。埋め込まれたサブフィールドにはcityとstateの 2 つがあります。ドキュメント内のネストされた各フィールドを明示的に指定する代わりに、インデックス定義により、ドキュメント内のすべてのサブフィールドの動的なマッピングが可能になります。クエリにはデフォルトで lucene.standard アナライザが使用されます。
{ "analyzer": "lucene.standard", "searchAnalyzer": "lucene.standard", "mappings": { "dynamic": false, "fields": { "company": { "type": "string", "analyzer": "lucene.whitespace", "multi": { "mySecondaryAnalyzer": { "type": "string", "analyzer": "lucene.french" } } }, "employees": { "type": "string", "analyzer": "lucene.standard" }, "address": { "type": "document", "dynamic": true } } } }