Atlas Search クエリ パフォーマンス
項目一覧
クエリ演算子とクエリの複雑さを考慮する
Atlas Search クエリの複雑さのレベルと使用される演算子のタイプは、データベースのパフォーマンスに影響を与える可能性があります。 複数の句を持つ高度に複雑なクエリは、 regex (正規表現) またはワイルドカード演算子を使用するクエリであるため、リソースを集中的に消費します。
複合クエリ
クエリに複数のネストされた複合ステートメントが含まれている場合は、これらが冗長でないことを確認してください。 句がプログラムで追加される場合は、クエリに冗長な句が含まれないように、アプリケーションに ロジックを実装することを検討してください。 mongot
must
should
句や 句など、 が実行するフィールドごとのスコア計算では実行時間が増加します。
ファセット検索
Atlas Searchファセットコレクター を使用してメタデータを抽出し、検索結果とメタデータに対して複数のクエリを実行しないようにできます。 例については、「メタデータと検索結果の例 」を参照してください。
結果のスコアリング
Atlas Search クエリは、スコアによってランク付けされます。 多数の結果を返すクエリは、結果セットのすべてのスコアを追跡する必要があるため、より計算負荷が高くなります。
または の代わりに$search
を使用する$text
$regex
MongoDB $text
および$regex
クエリに大きく依存しているアプリケーションの場合は、次の推奨事項を使用して、アプリケーションをリファクタリングするか、Atlas Search に移行するかを判断してください$search
。 $search
集計パイプライン ステージは、 MongoDB 演算子では使用できない機能、 または MongoDB 演算子では使用できても Atlas Search $search
としてはパフォーマンスが低い機能を提供します。
次の表は、MongoDB $regex
、 $text
、および Atlas Search $search
がアプリケーションの要件にどのように対処するかを示しています。
アプリケーションに必要な場合には、 | 使用... | 理由は... |
---|---|---|
書込み保証を尊重するデータストア | ||
書込みパフォーマンスに最適化されたクラスター | Atlas Search インデックスによってクラスターの書込みパフォーマンスが低下することはありません。 | |
大規模なデータセットの検索 | Atlas Search は逆インデックスを使用するため、非常に大規模なドキュメントを高速で検索できます。 | |
言語の認識 | Atlas Search は、言語をトークン化(検索可能なタームの作成)し、ストップワードを削除し、発音区別符号を解釈して検索の関連性を向上させることができる多くの言語アナライザをサポートしています。 詳しくは、「多言語 Atlas Search クエリの実行方法 」を参照してください。 | |
大文字と小文字を区別しないテキスト検索 | ||
結果テキストの強調表示 | Atlas Searchを強調表示すると、結果内のドキュメントをコンテキストに応じて把握できます。これは自然言語クエリに不可欠です。 | |
地理空間対応検索クエリ | MongoDB $regex と Atlas Search $search は地理空間パラメータの処理方法が異なります。 MongoDB では、座標間の線は球面であるため、空の移動などの長距離の座標に適しています。 Atlas Search は、座標間で直線を形成し、短い距離に適している Lucene を使用します。 詳しくは、「 Atlas Search 複合 Geo JSON クエリの実行方法 」を参照してください。 | |
オンプレミスまたはローカル配置 | Atlas Search は、オンプレミスまたはローカル配置では使用できません。 Atlas Search は、Atlas クラスター上のデータでのみ使用できます。 | |
検索クエリのオートコンプリート | 文字のオートコンプリート(nGrams)の場合、Atlas Search には、左から右へのオートコンプリート用の 単語のオートコンプリート( wordGrams )用に、Atlas Search には ping トークン フィルター が含まれています。このフィルターは、隣接する単語を連結して 1 つのトークンを作成することで単語ベースのオートコンプリートをサポートします。 詳細については、 「 Atlas Search でオートコンプリートを使用する方法 」チュートリアルを参照してください。 | |
テキスト入力でのファジー一致 | ||
複数の文字列に基づくフィルタリング | Atlas Search複合は、複数の文字列に基づくフィルタリングをサポートしています。 | |
関連性スコアソート検索 | Atlas Search は IBM 25アルゴリズム を使用します ドキュメントの検索関連性スコアを決定するため。乗算や因果関数などの boost 式や、アナライザ、検索演算子、シノニム(同意語)による高度な構成をサポートしています。 詳しくは、「加重フィールドを使用して Atlas Search 複合クエリを実行する方法 」を参照してください。 | |
部分インデックス | Atlas Search は部分インデックスをサポートしていません。 | |
部分一致 | Atlas Search のワイルドカード演算子とオートコンプリート演算子は部分一致クエリをサポートしています。 詳しくは、「部分一致 Atlas Search クエリの実行方法 」を参照してください。 | |
配列の単一複合インデックス | Atlas Search のターム インデックスは 1 つの Atlas Search インデックスで交差されるため、配列のフィルタリングに複合インデックスが不要になります。 | |
シノニム(同意語)検索 | Atlas Search は別のコレクションで定義されたシノニムをサポートしています。このコレクションは、検索インデックスで参照して使用できます。 詳しくは、「 Atlas Searchでシノニムを使用する方法 」チュートリアルを参照してください。 | |
カウントのファセット | Atlas Search は、テキスト条件に基づいてドキュメントの高速カウントを提供し、数値と日付のファセット検索もサポートしています。 詳しくは、「 Atlas Searchでファセットの使用方法 」を参照してください。 | |
Extract metadata | Atlas Searchファセットコレクターはメタデータを返すため、メタデータを取得するために複数のクエリを実行する必要はありません。 詳しくは、「 Atlas Searchでファセットの使用方法 」チュートリアルを参照してください。 | |
カスタムアナライザ | Atlas Search は、特定のインデックス要件に合わせてカスタムアナライザをサポートしています。 たとえば、カスタムアナライザを使用して、メールアドレスと HTTPまたはHTTPS URLのインデックスを作成して検索できます。 詳細については、「カスタム アナライザの定義 」および「 Atlas Search 発音区別符号を区別しないクエリの実行方法 」を参照してください。 | |
フレーズまたは複数の単語を検索 | Atlas Search のフレーズ演算子は、一連のタームの検索をサポートしています。 | |
正規表現による検索 | 代わりに Atlas Search のオートコンプリート演算子を使用すると、Atlas Search のパフォーマンスが向上します。 |
Tip
以下も参照してください。
「Atlas Search を使用して $text クエリを更新し、検索パフォーマンスを向上させる」では、クエリ内の
$text
集計パイプライン ステージを$search
に置き換えて、これらのクエリの柔軟性とパフォーマンスの両方を向上させる方法について説明します。Atlas Search を使用して全文正規表現クエリを実行する - では、非効率的な正規表現一致を
$search
に置き換えてテキスト クエリのパフォーマンスを向上させる方法について説明します。
の前に$limit
を使用する$facet
$limit
集計パイプラインライン ステージの後に$facet
集計パイプラインステージを使用すると、クエリのパフォーマンスに悪影響を影響可能性があります。パフォーマンスのボトルネックを回避するには、$limit
の 前に$facet
を使用します。
例
{ { "$search": {...} }, { "$limit": 20 }, { "$facet": { "results": [], "totalCount": $$SEARCH_META } } }
デモについては、次の例を参照してください。
$match
の後に を避ける$search
$search ステージの後に $match 集計パイプライン ステージを使用すると、クエリ結果を大幅に低下させる可能性があります。可能であれば、必要なフィルタリングがすべて$search
ステージで発生するように$search
クエリを設計して、 $match
ステージが不要になります。
Atlas Search複合演算子は、複数のフィルタリング操作を必要とするクエリに役立ちます。 集計パイプラインで$match
ステージを使用する必要がある場合は、 storedSourceオプション を使用して、 $match
条件が必要なフィールドのみを保存することを検討してください。 次に、 returnStoredSourceオプションを使用して保存されたフィールドを検索できます。
$group
の後に を避ける$search
$group
$search ステージの後に 集計パイプライン ステージを使用すると、クエリ結果が遅くなる可能性があります。$group
を使用してフィールド集計の基本カウントを取得する場合は、代わりに ステージ内で ファセット $searchMeta
を使用することを推奨します。
$count
の後に を避ける$search
$count
$search ステージの後に 集計パイプライン ステージを使用すると、クエリ結果が遅くなる可能性があります。$count
を使用してドキュメント数を取得する場合は、代わりに または $search
$searchMeta
ステージ内で count を使用することをお勧めします。
$sort
の後に を避ける$search
$search ステージの後に $sort 集計パイプライン ステージを使用すると、クエリ結果を大幅に低下させる可能性があります。
数値フィールド、日付フィールド、またはstringフィールドをソートするには、
$search
ステージでsort
オプションを使用します。 詳しくは、「 Atlas Search結果の並べ替え 」を参照してください。地理フィールドをソートするには、 near演算子を使用します。
他のフィールドをソートするには、
$sort
とreturnStoredSourceフィールド を使用します。
以降は と の使用を制限します$skip
$limit
$search
クエリの結果が大きい場合、 $skip
と$limit
を使用して結果を非連続的に取得すると遅くなる可能性があります。 最適なパフォーマンスを得るには、結果をページ分割するために$search
searchAfter
またはsearchBefore
オプションを使用します。 詳細については、「結果のページ分割 」を参照してください。
ページ2からページ5に移動するなど、非連続的な結果を返すには、次のパイプライン ステージを使用できます。
ここで、クエリは、 searchAfter
を使用しなかった場合に4ページをスキップするのではなく、 2ページの結果のみをスキップするように最適化されます。 これのデモについては、「クエリ結果をページ分割する方法 」を参照してください。
パフォーマンスの監視
Atlas クラスターを監視し、パフォーマンス統計を含むチャートを表示するには、Atlas Metricsタブを使用します。 これらのメトリクスは、Atlas Search のクエリとインデックスのビルドがクラスターのパフォーマンスにどのように影響するかを確認するのに役立ちます。 詳しくは、「 Atlas Search メトリクスの確認 」を参照してください。
AtlastriggerAtlasは、次の場合に アラート を することがあります。
Atlas Search はクラスターをクエリします。これは、クエリ ターゲティングメトリクスなど、Atlas のパフォーマンス メトリクスに影響を与える可能性があります。
Atlas Searchプロセス(
mongot
)がAtlas Search インデックスを最新の状態に保つために使用する change streamtrigger カーソルは、クエリ ターゲット設定率に貢献し、比率が高い場合は アラート を できます。Atlas Search は MongoDB からデータを複製します。これは、 getmore操作の回数など、Atlas で測定されるメトリクスに影響します。
注意
クラスターのリソースが限界に達している、または許容パフォーマンスの上限に近い場合は、Atlas Search 機能を実装する前に、より大きなクラスター階層へのアップグレードを検討してください。
学び続ける
このビデオでは、 explainと$search スコアの詳細を使用して Atlas Search 結果を理解し、反復処理し、改善する方法を学びます。
所要時間: 5分