パイプライン ステージ
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. 例、
facet
string
number
、 、またはdate
フィールドに対して (MongoDB Search 演算子)クエリを実行するには、stringFacet
number
、 などの対応するMongoDB Searchフィールドタイプを使用してフィールドのインデックスを作成します。それぞれ とdate
です。詳細については、サポートされているデータ型とサポートされていないデータ型 を参照してください。