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