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