パイプライン ステージ
Atlas Search クエリは、 集計パイプライン ステージの形式をとります。Atlas Search は $search ステージと $searchMeta ステージを提供しており、これらはいずれも、$lookup および $unionWith サブパイプラインを含むすべてのクエリ パイプラインの最初のステージである必要があります。これらのステージは、クエリ パイプライン内の他の集計パイプライン ステージと組み合わせて使用できます。
選択したパイプライン ステージに基づいて、クエリはフルテキスト検索の検索結果、または検索結果に関するメタデータのいずれかを返します。
集計パイプライン ステージ | 目的 |
|---|---|
全文検索の検索結果を返します。 | |
検索結果に関するメタデータを返します。 |
演算子とコレクター
Atlas Search はクエリ演算子とコレクターも備えています。これらツールは、$search ステージと $searchMeta 集計パイプライン ステージ内で使用できます。Atlas Search 演算子を使用すると、Atlas クラスターのコレクションから関連データを検索して取得できます。コレクターは、メタデータの検索結果を表すドキュメントを返します。
Atlas Search 演算子を使用して、ターム、フレーズ、地理的な形状と地点、数値、類似ドキュメント、同義語などをクエリできます。
正規表現とワイルドカード式を使用して検索することもできます。Atlas Search 複合演算子を使用すると、$search ステージで複数の演算子を組み合わせて複雑な検索を実行したり、Atlas Search によって返されるドキュメントに含めることが不可欠、禁止、推奨される項目に基づきデータをフィルタリングしたりできます。複合演算子は、$search ステージ自体でドキュメントを一致させたりフィルタリングしたりする目的でも使用できます。$matchを$searchの後に実行する方法は、$searchを複合演算子を用いて実行する方法よりパフォーマンスが低くなります。
演算子とコレクターの詳細については、「演算子とコレクター」を参照してください。
クエリ処理
mongod同じノードで とmongotクエリを実行する際、Atlas Search は構成済みの読み込み設定(read preference)を使用して、クエリを実行するノードを識別します。クエリはまず MongoDB プロセスに送られます。このプロセスは、レプリカセット クラスターの場合は
mongod、シャーディングされたクラスターの場合はmongosです。レプリカセット クラスターの場合、MongoDB プロセスは同じノード上の
mongotにクエリをルーティングします。 シャーディングされたクラスターの場合、クラスター データはmongodインスタンス全体で分割されます。各mongotは、同じノード上にあるmongodのデータのみを認識するため、 特定のシャードを対象とする Atlas Search クエリは実行できません。mongosはクエリをすべてのシャードに送り、これらをscatter-gatherパターンのクエリにします。 ゾーンを使用してシャーディングされたコレクションをクラスター内のシャードのサブセットにわたって分散する場合、Atlas Search はクエリしているコレクションのシャードを含むゾーンにクエリをルーティングして、次のシャードのみで$searchクエリを実行します。コレクションが配置されている。Atlas Search は検索とスコアリングを実行し、一致する結果のドキュメント ID とその他の検索メタデータを
mongodに返します。 次に、mongodは一致する結果のクエリをドキュメント全体で暗黙的に実行し、その結果をクライアントに返します。 クエリで$search同時実行オプションを使用すると、Atlas Search はクエリ内並列処理を有効にします。 詳細については、「セグメント間でのクエリ実行の並列化 」を参照してください。mongod異なるノードの とmongotクエリは実行されると、 構成済みの読みこみ設定(read preference ) に基づいてまず
mongodに送信されます。mongodプロセスは、同一ノード上のロード バランサーを通じて検索クエリを転送します。その結果、mongotプロセス全体にリクエストが分散されます。Atlas Search
mongotプロセスは検索とスコアリングを実行し、一致する結果のドキュメント ID とメタデータをmongodに返します。 次に、mongodはドキュメント全体で一致する結果の検索を実行し、その結果をクライアントに返します。 クエリで$search同時実行オプションを使用すると、Atlas Search はクエリ内並列処理を有効にします。 詳細については、「セグメント間でのクエリ実行の並列化 」を参照してください。
スコアリング
Atlas Search は関連性ベースのスコアを結果セット内の各ドキュメントに関連付けます。関連性を基準にスコアリングすることで、スコアの高いものから低いものの順にドキュメントを返すことができます。スコアは、クエリ用語がドキュメントに頻繁に表示される場合は高く、クエリ用語がコレクション内の多数のドキュメントにわたり表示される場合は低くなります。Atlas Search では、boost、decay などのスコアの変更関数を使用することで、関連性ベースのデフォルト スコアをカスタマイズすることもできます。結果内のスコアをカスタマイズする方法の詳細については、「結果内のドキュメントのスコアリング」を参照してください。
サポートされているクライアント
次のクライアントを使用して、Atlas 検索クエリを作成および実行することができます。
クエリのトラブルシューティング
空の結果セット
mongot はエラーを返しませんが、 $searchクエリが次の場合には空の結果セットを返します。
存在しないインデックスを参照しています。クエリでインデックス名を指定しない場合、Atlas Search はデフォルトで
defaultという名前のインデックスを使用します。defaultという名前のインデックスが存在しない場合や、指定したインデックスが存在しない場合でも、Atlas Search はエラーを返さず、空の結果セットを返します。indexオプションを使用して、有効なインデックスをその名前で指定することができます。インデックスのないフィールドを指定します。 インデックスがないフィールドに対してクエリを実行した場合、Atlas Search はエラーを返さず、空の結果セットを返します。
pathパラメータの値としてインデックス付きフィールドのみを指定する必要があります。 コレクションのインデックス定義で動的マッピングを有効にすると、コレクション内のすべての動的にインデックス作成可能なフィールドが自動的にインデックス化されます。 詳しくは、動的マッピング を参照してください。stringタイプとしてインデックスされていないフィールドパスでtext演算子を使用します。 フィールドがstring以外の Atlas Search フィールドタイプstringFacetやautocompleteなど)としてインデックス付けされている場合、Atlas Search はエラーを返さず、空の結果セットを返します。 テキスト 演算子を使用してフィールドをクエリするには、 BSON データ型の値を string としてインデックス化する 必要 があります。string
PlanExecutor エラー
mongot は、 $searchクエリが次の場合にPlanExecutorエラーを返します。
誤ったデータ型としてインデックス付けされたフィールドを指定します。 この場合、 クエリを実行すると、Atlas Search は、誤ってインデックスが作成されたフィールドとその正しいデータ型を識別するエラー メッセージを返します。 例:
PlanExecutor error during aggregation :: caused by :: Cannot facet on field "genres" because it was not indexed as a "stringFacet" field. たとえば、
facetコレクター クエリをstring、number、またはdateフィールドに対して実行するには、stringFacet、number、およびdateなどの対応するAtlas Searchフィールド タイプを使用してフィールドのインデックスを作成します。詳細については、「サポートされているデータ型とサポートされていないデータ型」をご覧ください。