Docs Menu
Docs Home
/
Atlas
/

クエリとインデックス

検索クエリと検索インデックスの関係によって、 MongoDB Search を使用してMongoDBコレクション内のデータをどの程度効率的かつ効果的に見つけることができるかが決まります。

MongoDB Search クエリは、 データベース内のドキュメントを検索するための基準を指定します。MongoDB Search クエリは、:$search または$searchMeta パイプラインステージで始まる 集計パイプラインの形式をとります。パイプラインステージ内で演算子コレクター、および検索オプションを使用して、全文検索、関連性ベースのランキング、ファセット検索、フィルタリング、ソートなどの複雑な検索機能を実装できます。

MongoDB Search クエリを実行する前に、検索するフィールドにMongoDB Searchインデックスを作成する必要があります。検索インデックスは、クエリの検索条件を満たすドキュメントを迅速に取得するために最適化されたデータ構造です。検索インデックスを定義する ときは、インデックスを作成するフィールドと、これらのフィールドをどのようにトークン化するかを指定します。

効果的な検索クエリの実現には、検索インデックスの適切な定義が必須です。検索しようとするフィールドにはインデックスを付ける必要があり、インデックス設定によって検索がソート、ファセット、オートコンプリート、その他の検索機能をサポートするかどうかが決まります。クエリとインデックスの両方の設計を反復して、検索の精度とパフォーマンスのバランスを取ることができます。

このページでは、 MongoDB Search 検索エクスペリエンスを計画し、検索要件に合わせてMongoDB Searchインデックスとクエリを定義する方法について説明します。

MongoDB Search の実装を計画するときは、まず、提供する検索エクスペリエンスを定義するから始めます。

  • アプリケーションで実行する必要がある検索の種類を明確に特定します。記事タイトルの全文検索とオートコンプリートが必要なブログウェブサイトの検索機能、または、ファセット検索と製品カテゴリによるフィルターが必要なeコマースサイトの検索機能を構築していますか?

  • ユーザーがアプリケーションと対話する方法を決定します。迅速な応答時間や正確なオートコンプリートの提案など、ユーザー エクスペリエンスを向上させる機能を優先します。

次に、ユーザーのニーズに基づいてMongoDB Search のインデックスとクエリの構造を決定するために、次の質問を検討します。

MongoDB Search を使用してデータを検索する前に、 MongoDB Search クエリ中に使用する 1 つ以上のMongoDB Search インデックスを作成する必要があります。このセクションでは、 MongoDB Searchインデックスの JSON構成構文にクエリ設定を適用する方法を説明します。

JSON 構文をこのセクションのインデックス定義で使用するには、プレースホルダーを有効な値に置き換え、完全なインデックス定義に必要なオプションが含まれていることを確認します。

MongoDB Searchインデックスをクラスターに追加する方法については、 MongoDB Search クイック スタート を参照してください。

1

コレクション内のどのフィールドをクエリするかがわかっている場合は、静的マッピングを有効にし、 MongoDB Searchインデックス定義でフィールドを指定します。それ以外の場合、動的マッピングを有効にして、サポートされているタイプのすべてのフィールドのインデックスを自動的にインデックスできます。

To learn more, see Dynamic and Static Mappings.

重要:コレクションに16 MB 以上のドキュメントが含まれている場合、 MongoDB Search はデータのインデックスに失敗します。この問題は、大きなドキュメントでのアップデート操作により変更ストリームイベントが 16 MB のBSON制限を超えた場合にも発生する可能性があります。これを回避するために、次のベストプラクティスの採用を検討しましょう。

  • サブドキュメントや配列のサイズを最小限に抑えるように、ドキュメントを構造化してください。

  • 大規模なフィールド、サブドキュメント、または配列を更新または置換する操作は避けてください。

詳細については、「Change Streams 運用に関する推奨事項」および「大きなドキュメントのサイズを縮小する」を参照してください。

1{
2 "mappings": {
3 "dynamic": true
4 }
5}
1{
2 "mappings": {
3 "dynamic": true|false,
4 "fields": {
5 "<field-name>": {
6 "type": "<field-type>",
7 ...
8 },
9 ...
10 }
11 }
12}
2

特殊言語や解析要件がある場合は、インデックス定義に次のオプションを適用できます。

analyzersearchAnalyzer、または fields.<field-name>.analyzer フィールドでインデックスを作成する string フィールドに適用する組み込みアナライザを指定します。

1{
2 "analyzer": "<index-analyzer-name>", // top-level index analyzer, used if no analyzer is set in the field mappings
3 "searchAnalyzer": "<search-analyzer-name>", // query text analyzer, typically the same as the index analyzer
4 "mappings": {
5 "dynamic": <boolean>,
6 "fields":{
7 "<field-name>": [
8 {
9 "type": "string",
10 "analyzer": "<field-analyzer-name>" // field-specific index analyzer
11 }
12 ]
13 }
14 }
15}

MongoDB Searchインデックスのカスタムアナライザanalyzersフィールドで定義します。

1{
2 "analyzers": [
3 {
4 "name": "<custom-analyzer-name>",
5 "tokenizer": {
6 "type": "<tokenizer-type>"
7 }
8 },
9 ...
10 ]
11}

synonyms フィールドで同じまたは類似の意味を持つ用語のシノニムを定義します。

1{
2 "synonyms": [
3 {
4 "name": "<synonym-mapping-name>",
5 "source": {
6 "collection": "<source-collection-name>"
7 },
8 "analyzer": "<synonym-mapping-analyzer>"
9 }
10 ]
11}
3

大規模なデータセットでクエリ パフォーマンスを最適化する場合は、次のオプションをインデックス定義に追加して、 MongoDB Search クエリが走査する必要があるデータ量を制限できます。

numPartitions オプションを使用して、インデックスのパーティションを構成します。インデックスを 分割 すると、 MongoDB Search はインデックスオブジェクトをサブインデックス間で最適な方法で自動的に分散します。

1{
2 "numPartitions": <integer>,
3}

storedSource オプションを使用して、 MongoDB Search が保存する必要があるソースドキュメント内のフィールドを指定します。

1{
2 "storedSource": true | false | {
3 "include" | "exclude": [
4 "<field-name>",
5 ...
6 ]
7 }
8}

コレクション内の検索するすべてのフィールドのMongoDB Searchインデックスを作成したら、 MongoDB Search クエリを実行できます。このセクションでは、アプリケーションの検索エクスペリエンスの目的をMongoDB Search クエリのJSON構文に適用する方法を説明します。

MongoDB Search クエリ集計パイプラインでこのセクションのJSON構文を使用するには、プレースホルダーを有効な値に置き換え、完全なクエリパイプラインに必要な$search フィールドまたは$searchMeta フィールドが含まれていることを確認します。

検索クエリの実行方法については、 MongoDBクイック検索スタート を参照してください。

1

MongoDB Search クエリ集計パイプラインの最初のステージは、ドキュメントを検索するか、メタデータを検索するかに応じて、$search ステージまたは $searchMeta ステージである必要があります。

集計パイプライン ステージ
目的

全文検索の検索結果を返します。

検索結果に関するメタデータを返します。

2

検索条件を定義するには、演算子またはコレクター$search または$searchMeta パイプライン ステージに 1 つ以上適用する必要があります。

MongoDB Search 演算子を使用すると、コンテンツ、形式、または データ型 に従って、クラスターから関連するデータを検索して取得できます。各フィールド型の検索をサポートする演算子については、演算子参照セクションの表を参照してください。演算子のクエリパスパラメーターに 1 つ以上のインデックス作成された検索フィールドを指定する必要があります。

1{
2 $search: {
3 "<operator-name>"|"<collector-name>": {
4 <operator-specification>|<collector-specification>
5 }
6 }
7}
[
{
_id: <result-document-id>,
...
},
{
_id: <result-document-id>,
...
},
...
]
1{
2 $searchMeta: {
3 "<operator-name>"|"<collector-name>": {
4 <operator-specification>|<collector-specification>
5 }
6 }
7}
[
{
count: {
total: <results-count>
}
}
]

Tip

compound 演算子を使用して、複数の演算子を1つの操作にまとめることができます。compound 演算子の filter 句を使用して、指定された句に一致するクエリ出力をフィルタリングすることもできます。

3

MongoDB Search クエリからメタデータを検索する場合は、次のいずれかの構成を適用して、メタデータ結果ドキュメント のカウントまたはfacet MongoDB Search 演算子)タイプのどちらかを選択できます。

検索結果の合計または下限値を返すには、集計ステージで カウント オプションを設定します。

$searchMeta ステージは countメタデータの結果を返しますが、$search ステージはメタデータの結果を $$SEARCH_META集計変数 に保存し、検索結果のみを返します。$$SEARCH_META 変数から countメタデータの結果を検索する方法の例については、結果のカウント を参照してください。

1{
2 "$search" | "$searchMeta": {
3 "<operator-name>": {
4 <operator-specifications>
5 },
6 "count": {
7 "type": "lowerBound" | "total",
8 "threshold": <number-of-documents> // Optional
9 }
10 }
11}

値または範囲で結果をグループ化し、これらの各グループのカウントを返すファセットクエリを実行するには、集計ステージで facet(MongoDB Search 演算子) コレクターを使用します。

$searchMeta ステージはfacet メタデータ結果を返し、$search ステージはこのメタデータ結果を $$SEARCH_META 集計変数に保存し、検索結果のみを返します。$$SEARCH_META 変数から facet メタデータの結果を検索する方法の例については、「ファセット結果」を参照してください。

1{
2 "$search" | "$searchMeta": {
3 "facet": {
4 "facets": {
5 <facet-definitions>
6 }
7 }
8 }
9}
4

次のオプションを使用して、$search ステージの結果に関する追加情報を検索できます。

オプション
ユースケース

検索タームを元のコンテキストでクエリ結果のフィールドとして表示します。

MongoDB Search が返す各ドキュメントのスコアの詳細な内訳を取得します。

クエリの検索用語に関する分析情報を追跡し、提供します。

MongoDB Search がクエリの条件を満たすために実行した Lucene クエリと、クエリを実行するさまざまな段階で費やした時間に関する分析を取得します。

5

次のオプションを使用して、$search の検索結果に特別な順序付け機能を実装できます。

オプション
ユースケース

MongoDB Search が関連する結果を返すように、結果内のドキュメントの関連性スコアを変更します。

結果を数値、文字列、日付の各フィールド、またはスコアで並べ替えます。

順序付けられた結果を停止または開始するための参照点を設定します。

6

次の $search オプションを使用してクエリのパフォーマンスを最適化します。

オプション
ユースケース

MongoDB Search クエリをより効率的に実行するには、コレクションのMongoDB Searchインデックス定義で指定された mongot に保存されているフィールドのみを取得します。

専用の検索ノードでセグメント全体の検索を並列化します。

MongoDB SearchインデックスとMongoDB Search クエリを構築して実行する方法については、MongoDB Search クイック スタートを参照してください。

このチュートリアルで言及されているMongoDB Search クエリ構成オプションについて詳しくは、次の参照ページを参照してください。

このチュートリアルで言及されているMongoDB Searchインデックスの構成オプションについて詳しくは、次の参照ページを参照してください。

戻る

ファセット

項目一覧