検索クエリと検索インデックスの関係によって、 MongoDB Search を使用してMongoDBコレクション内のデータをどの程度効率的かつ効果的に見つけることができるかが決まります。
MongoDB Search クエリは、 データベース内のドキュメントを検索するための基準を指定します。MongoDB Search クエリは、:$search または$searchMeta パイプラインステージで始まる 集計パイプラインの形式をとります。パイプラインステージ内で演算子、コレクター、および検索オプションを使用して、全文検索、関連性ベースのランキング、ファセット検索、フィルタリング、ソートなどの複雑な検索機能を実装できます。
MongoDB Search クエリを実行する前に、検索するフィールドにMongoDB Searchインデックスを作成する必要があります。検索インデックスは、クエリの検索条件を満たすドキュメントを迅速に取得するために最適化されたデータ構造です。検索インデックスを定義する ときは、インデックスを作成するフィールドと、これらのフィールドをどのようにトークン化するかを指定します。
効果的な検索クエリの実現には、検索インデックスの適切な定義が必須です。検索しようとするフィールドにはインデックスを付ける必要があり、インデックス設定によって検索がソート、ファセット、オートコンプリート、その他の検索機能をサポートするかどうかが決まります。クエリとインデックスの両方の設計を反復して、検索の精度とパフォーマンスのバランスを取ることができます。
このページでは、 MongoDB Search 検索エクスペリエンスを計画し、検索要件に合わせてMongoDB Searchインデックスとクエリを定義する方法について説明します。
検索エクスペリエンスの計画
MongoDB Search の実装を計画するときは、まず、提供する検索エクスペリエンスを定義するから始めます。
アプリケーションで実行する必要がある検索の種類を明確に特定します。記事タイトルの全文検索とオートコンプリートが必要なブログウェブサイトの検索機能、または、ファセット検索と製品カテゴリによるフィルターが必要なeコマースサイトの検索機能を構築していますか?
ユーザーがアプリケーションと対話する方法を決定します。迅速な応答時間や正確なオートコンプリートの提案など、ユーザー エクスペリエンスを向上させる機能を優先します。
次に、ユーザーのニーズに基づいてMongoDB Search のインデックスとクエリの構造を決定するために、次の質問を検討します。
アプリケーションユーザーがドキュメントの内容を返すか、ドキュメントに関するメタデータを返すかを検討してください。
ユーザーがドキュメントの内容を知りたい場合は、
$search集計ステージを使用して、検索条件に一致するドキュメントを返します。ユーザーが検索結果に関するメタデータを取得したい場合は、
$searchMetaステージを使用して、一致するドキュメントとファセットのカスタマイズ可能な件数を返します。
コレクション内のユーザーが検索する可能性が高い特定のフィールドを特定して、インデックスを作成するフィールドを把握します。各MongoDB Search クエリは、コレクション内の 1 つ以上の指定されたフィールドから抽出されたタームを含む単一のMongoDB Searchインデックスを検索します。MongoDB Search クエリを計画するときは、静的マッピングまたは動的マッピングを有効にして、キー フィールドのみをインデックスするか、指定されたコレクション内のすべてのフィールドをインデックスかを決定します。クエリパスをフィールドの配列として指定するか、queryString 演算子を使用することで、複数のフィールドをクエリできます。
ユーザーの一般的な検索タームは、クラスター内のデータと完全一致、類似一致、または部分一致する場合があります。例、映画レビューアプリケーションのユーザーは、正確な年の映画をフィルタリングして返したり、お気に入りの映画に似た映画の推奨事項を表示したりしたい場合があります。
ユーザーが検索している一致のタイプを特定して、 MongoDB Search クエリで使用する演算子に通知します。
完全一致の場合は、equals や in などの演算子を使用して、指定された
query値と同一の用語を含むドキュメントを一致させます。また、text 演算子を使用して、query値にanyまたはallの文字列を含むドキュメントを一致させることもできます。類似一致では、near、moreLikeThis、または phrase のような演算子を使用して、指定された検索用語に類似する数値、ドキュメント、または文字列の順序を含むドキュメントを一致させます。また、range 演算子を使用して、指定された範囲内の値を含むドキュメントを一致させることもできます。
入力しながら検索するクエリなどの部分一致の場合は、 オートコンプリート 、 正規表現 、または ワイルドカード などの演算子を使用して、入力しながら検索する機能を実装するか、正規表現を使用してタームを一致させます。
複合演算子を使用して、複数のマッチング動作を 1 つのクエリに結合します。
テキスト正規化、複数言語のサポート、ステミングなどを必要とするアプリケーションでは、 MongoDB Search のテキスト分析ツールを活用します。
インデックス定義において、テキストデータの言語と性質に合った組み込みアナライザを選択してください。アナライザはテキストを用語やトークンに分解し、句読点や大文字を削除したり、単語を原形に変換したりするなど、テキストを調整することができます。
アプリケーションに、ドメイン固有の gergon の処理や、メールアドレスやダッシュ区切りの ID などの形式のテキストの解析などの特定の要件がある場合は、カスタムアナライザを構成します。カスタムアナライザを使用すると、テキストを文字ごとにフィルタリングしたり、各トークン チャンクに含める文字数を定義したり、 ステミング やリダクションを有効にしたりできます。
シノニムを定義して、同じまたは類似の意味を持つ用語の検索精度を向上させます。
ユーザーのフィルター、並べ替え、または関連性の要求に基づいて、検索結果の表示を調整することができます。
スコア クエリ オプションを使用して、ドキュメントの関連性スコアを変更し、ユーザーが結果を表示する順序に影響します。MongoDB Search クエリは関連性ベースのスコアを結果セット内の各ドキュメントに関連付け、最高スコアから最低スコアの順にドキュメントを返します。
sort クエリオプションを、ユーザーが昇順または降順でソートする可能性のある日付や数値フィールドなどのインデックス付きフィールドに設定します。
searchBefore または searchAfter クエリオプションを使用すると、結果を一連のページとして表示し、ユーザーは順番に移動したりスキップしたりすることができます。
facet(MongoDB Search 演算子)コレクターを使用して、ユーザーがカテゴリやその他のディメンションで結果をフィルタリングできるようにします。これにより、検索結果の関連性が大幅に向上し、ユーザーにはよりガイドのある検索エクスペリエンスが提供されます。
MongoDB Search クエリのパフォーマンスは、インデックス構成とクエリの複雑さによって影響されます。アプリケーションの検索機能に重要なフィールドのインデックス作成に焦点を当て、クエリの複雑さと速度の論理的なバランスを実現します。
パフォーマンスをさらに最適化するには、次のクエリ オプションを検討してください。
concurrent クエリオプションを使用して、クエリを評価するときに実行される同時検索リクエストの数を設定します。このオプションは、複雑なクエリや大規模なデータセットに役立ちます。
returnStoredSource クエリオプションを storedSource インデックスオプションと組み合わせて使用し、検索結果と共にインデックスの一部として保存されている元のソースドキュメントを返すかどうかを決定します。このオプションは、検索条件に基づいて要約やハイライトを表示する用途で有用です。
numPartitions インデックスオプションを使用してインデックスをパーティション化し、インデックスオブジェクトをサブインデックス間で最適に分散させます。
クエリ パフォーマンスを最適化する方法に関する詳細な推奨事項については、 MongoDB Search クエリ パフォーマンス を参照してください。
インデックスを定義する
MongoDB Search を使用してデータを検索する前に、 MongoDB Search クエリ中に使用する 1 つ以上のMongoDB Search インデックスを作成する必要があります。このセクションでは、 MongoDB Searchインデックスの JSON構成構文にクエリ設定を適用する方法を説明します。
JSON 構文をこのセクションのインデックス定義で使用するには、プレースホルダーを有効な値に置き換え、完全なインデックス定義に必要なオプションが含まれていることを確認します。
MongoDB Searchインデックスをクラスターに追加する方法については、 MongoDB Search クイック スタート を参照してください。
インデックスを作成するフィールドを選択してください。
コレクションでクエリしたいフィールドがわかっている場合は、静的マッピングを有効にし、MongoDB Search インデックス定義でフィールドを指定します。そうでなければ、動的マッピングを有効にして、すべてのフィールドをデフォルトまたは設定されたフィールドタイプ(typeSet)に基づいて自動的にインデックス化できます。
詳しくは、動的マッピングと静的マッピング を参照してください。
重要:コレクションに16 MB 以上のドキュメントが含まれている場合、 MongoDB Search はデータのインデックスに失敗します。この問題は、大きなドキュメントでのアップデート操作により変更ストリームイベントが 16 MB のBSON制限を超えた場合にも発生する可能性があります。これを回避するために、次のベストプラクティスの採用を検討しましょう。
サブドキュメントや配列のサイズを最小限に抑えるように、ドキュメントを構造化してください。
大規模なフィールド、サブドキュメント、または配列を更新または置換する操作は避けてください。
詳細については、「Change Streams 運用に関する推奨事項」および「大きなドキュメントのサイズを縮小する」を参照してください。
1 { 2 "mappings": { 3 "dynamic": true | { 4 "typeSet": "<typset-name>" 5 }, 6 "typeSets": [ 7 { 8 "name": "<typset-name>", 9 "types": [ 10 { 11 "type": "<field-type>" 12 }, 13 ... 14 ] 15 }, 16 ... 17 ] 18 } 19 }
1 { 2 "mappings": { 3 "dynamic": true|false, 4 "fields": { 5 "<field-name>": { 6 "type": "<field-type>", 7 ... 8 }, 9 ... 10 } 11 } 12 }
(任意) テキスト分析ルールを適用します。
stringデータに特別な言語要件、解析要件、スコアリング要件がある場合は、インデックス定義に以下のオプションを適用できます。
MongoDB Searchでテキストフィールドをトークンに分割する方法を指定するには、組み込みアナライザをMongoDB Search 検索インデックスに設定します。
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|autocomplete", 10 "analyzer": "<field-analyzer-name>" // field-specific index analyzer 11 "multi": { 12 "<multi-option-name>": { 13 "type": "string|autocomplete", 14 "analyzer": "<alternate-analyzer-name>" // multi-option specific index analyzer 15 } 16 } 17 } 18 ] 19 } 20 } 21 }
MongoDB 検索がテキストをトークンに分割する方法をカスタマイズするには、MongoDB 検索インデックスの analyzers フィールドでカスタムアナライザを定義できます。
1 { 2 "analyzers": [ 3 { 4 "name": "<custom-analyzer-name>", 5 "tokenizer": { 6 "type": "<tokenizer-type>" 7 } 8 }, 9 ... 10 ] 11 }
MongoDB Search でクエリ中に関連スコアを計算するために使用する類似性アルゴリズムを設定するには、string フィールドの similarity.type プロパティでインデックスとして MongoDB Search string または autocomplete タイプで指定されたアルゴリズムを指定します。
このオプションは 、テキスト、 フレーズ、 queryString、 オートコンプリート 演算子が関連性スコアをどのように計算するかを決定します。さまざまな類似性アルゴリズムについて詳しく学ぶには、「スコアの詳細」を参照してください。
1 "mappings": { 2 "fields": { 3 "<field-name>": { 4 "type": "string|autocomplete", 5 "similarity": { 6 "type": "bm25|boolean|stableTfl" 7 }, 8 }, 9 "<field-name>": { 10 "type": "string", 11 "multi": { 12 "<multi-option-name>": { 13 "type": "string", 14 "similarity": { 15 "type": "bm25|boolean|stableTfl" 16 } 17 } 18 } 19 } 20 } 21 }
(任意)クエリのパフォーマンスを最適化するためのオプションを追加します。
大規模なデータセットでクエリ パフォーマンスを最適化する場合は、次のオプションをインデックス定義に追加して、 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クイック検索スタート を参照してください。
最初のMongoDB Searchパイプラインステージを選択します。
MongoDB Search クエリ集計パイプラインの最初のステージは、ドキュメントを検索するか、メタデータを検索するかに応じて、$search ステージまたは $searchMeta ステージである必要があります。
集計パイプライン ステージ | 目的 |
|---|---|
全文検索の検索結果を返します。 | |
検索結果に関するメタデータを返します。 |
演算子を適用して、検索条件を定義します。
検索条件を定義するには、演算子またはコレクターを $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> } } ]
(任意)オプションまたは コレクター を適用して、メタデータを返します。
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 }
(任意) MongoDB Search クエリに関する追加情報を取得するには、 $search ステージに検索オプションを追加します。
次のオプションを使用して、$search ステージの結果に関する追加情報を検索できます。
オプション | ユースケース |
|---|---|
検索タームを元のコンテキストでクエリ結果のフィールドとして表示します。 | |
MongoDB Search が返す各ドキュメントのスコアの詳細な内訳を取得します。 | |
クエリの検索用語に関する分析情報を追跡し、提供します。 | |
MongoDB Search がクエリの条件を満たすために実行した Lucene クエリと、クエリを実行するさまざまな段階で費やした時間に関する分析を取得します。 |
(任意)結果のランキングを定義するために $search オプションを追加します。
次のオプションを使用して、$search の検索結果に特別な順序付け機能を実装できます。
オプション | ユースケース |
|---|---|
MongoDB Search が関連する結果を返すように、結果内のドキュメントの関連性スコアを変更します。 | |
結果を数値、文字列、日付の各フィールド、またはスコアで並べ替えます。 | |
順序付けられた結果を停止または開始するための参照点を設定します。 |
詳細
MongoDB SearchインデックスとMongoDB Search クエリを構築して実行する方法については、MongoDB Search クイック スタートを参照してください。
このチュートリアルで言及されているMongoDB Search クエリ構成オプションについて詳しくは、次の参照ページを参照してください。
このチュートリアルで言及されているMongoDB Searchインデックスの構成オプションについて詳しくは、次の参照ページを参照してください。