検索クエリと検索インデックスの関係によって、 MongoDB Search を使用してMongoDBコレクション内のデータをどの程度効率的かつ効果的に見つけることができるかが決まります。
MongoDB Search queries specify the criteria for finding documents within a database. MongoDB Search queries take the form of an aggregation pipeline that begins with the $search or $searchMeta pipeline stage. You can use operators, collectors, and search options inside the pipeline stages to implement complex search functionality like full-text search, relevance-based ranking, faceted search, filtering, and sorting.
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 クイック スタート を参照してください。
インデックスを作成するフィールドを選択してください。
コレクションでクエリしたいフィールドがわかっている場合は、静的マッピングを有効にし、MongoDB Search インデックス定義でフィールドを指定します。そうでなければ、動的マッピングを有効にして、すべてのフィールドをデフォルトまたは設定されたフィールドタイプ (typeSet) に基づいて自動的にインデックス化できます。
詳しくは、動的マッピングと静的マッピング を参照してください。
注意
MongoDB Search インデックスの動作と制限の詳細については、「MongoDB Search インデックスの注意事項」を参照してください。
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 }
(任意) テキスト分析ルールを適用します。
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 Search がテキストをトークンに分割する方法をカスタマイズするには、MongoDB Search インデックスの 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 型で指定されたアルゴリズムを指定します。
このオプションは、text、phrase、queryString、autocomplete 演算子が関連性スコアを計算する方法を決定します。さまざまな類似性アルゴリズムについて詳しく学ぶには、「スコアの詳細」を参照してください。
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 }
クエリを定義する
After you create an MongoDB Search index for all the fields that you want to search in your collection, you can run a MongoDB Search query. This section demonstrates how to apply your goals for your application's search experience to the JSON syntax of a MongoDB Search query.
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 }
1 { 2 $searchMeta: { 3 "<operator-name>"|"<collector-name>": { 4 <operator-specification>|<collector-specification> 5 } 6 } 7 }
(任意)オプションまたは コレクター を適用して、メタデータを返します。
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インデックスの構成オプションについて詳しくは、次の参照ページを参照してください。