定義
構文
compound の構文は次のとおりです。
{ $search: { "index": <index name>, // optional, defaults to "default" "compound": { <must | mustNot | should | filter>: [ { <clauses> } ], "score": <options>, "doesNotAffect": "<facet-to-exclude>" | [<array-of-facets>] } }}それぞれの must、mustNot、should、および filter 句には、サブ句の配列が含まれています。配列にサブ句が 1 つしか含まれていない場合でも、配列構文を使用します。このページの例を参照してください。
オプション
compound では、次の用語を使用してクエリを作成します。
ドキュメントが結果に含まれるために一致する必要がある句。返されるスコアは、句内のすべてのサブクエリのスコアの合計です。
| |
ドキュメントが結果に含まれるためには、一致してはならない句。
| |
結果に含まれるドキュメントの中で、一致させたい句。
複合クエリ内で | |
ドキュメントが結果に含まれるために、すべて一致しなければならない句。 たとえば、 代わりに、 別のフィルターの例を参照してください。 | |
| |
| このクエリに基づいてカウントの再計算から除外するファセットまたはファセットのリスト。値は、 |
使用法
クエリ条件の指定には、autocomplete、text、span などの任意の最上位の演算子を含む句を使用できます。
パフォーマンスを最適化するには、equals、range、in などの非スコアリング演算子を filter 句に配置して、不要なスコアリング操作を回避します。複数の操作を OR 条件として評価する必要がある場合は、最上位の filter 内に should 句をネストします。
例
[ { $search: { index: "default", compound: { filter: [ { compound: { should: [ { equals: { path: "accommodates", value: 2 } }, { range: { path: "pricePerNight", lte: 200 } } ] } } ] } } }]スコアリングの動作
MongoDB Search は、ドキュメントで一致を生成した個々の句ごとにドキュメントが受け取ったスコアを合計することで、結果セット内のドキュメントをスコアリングします。スコアリングには、must 句と should 句のみが参加します。結果セットは、スコアの高いものから低いものの順に並べられます。
次の表は、スコアに貢献するものと貢献しないものの compound 句を示しています。
句 | スコアに貢献する |
|---|---|
| |
| |
| |
|
score オプションを使用して、複合クエリ全体のスコアをブーストまたは置換できます。複合スコア全体を置き換える例については、以下の複合スコアの例を参照してください。スコアを使用して、各句内の各サブクエリのスコアをブーストまたは変更することもできます。compound 演算子句でスコアが変更された例については、「スコアの変更」を参照してください。
例
次の例は、 MongoDB Search Playground または クラスターで試すことができます。
サンプル コレクション
このページで サンプル クエリ を実行するには、クラスター上に fruit という名前のコレクションを作成し、次のドキュメントをコレクションに挿入します。
{ "_id" : 1, "type" : "apple", "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.", "category" : "nonorganic", "in_stock" : false},{ "_id" : 2, "type" : "banana", "description" : "Bananas are usually sold in bunches of five or six.", "category" : "nonorganic", "in_stock" : true},{ "_id" : 3, "type" : "pear", "description" : "Bosc and Bartlett are the most common varieties of pears.", "category" : "organic", "in_stock" : true}サンプル インデックス
このページで サンプル クエリ を実行するには、fruit サンプル コレクション 上に、次の MongoDB Search インデックスを default という名前で作成します。インデックス定義により、MongoDB Search は次の操作を実行するように構成されます。
デフォルトの 標準 アナライザを使用して、 コレクション内のすべてのフィールドを 動的にインデックス化 し、トークンを抽出します。
fruitstandardアナライザはすべての単語を小文字にし、"the"、"a"、"and"などの一般的なストップワードを無視します。
{ "mappings": { "dynamic": true, "fields": { "type": [ { "type": "string" }, { "type": "token" } ] } }}サンプル クエリ
次のクエリは、 MongoDB Search クエリの $search compound 演算子を示しています。
must と mustNot の例
次の例では、must 句と mustNot 句の組み合わせを使用してクエリを構築します。must 句はテキスト演算子を使用して、description フィールド内の varieties というタームを検索します。ドキュメントが一致するには、must 句を満たす必要があります。mustNot 句は、description フィールド内の apples というタームの検索操作を実行します。ドキュメントが一致するには、mustNot 句を満たさない必要があります。
db.fruit.aggregate([ { "$search": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "mustNot": [{ "text": { "query": "apples", "path": "description" } }] } } }])上記のクエリでは、description フィールドに varieties という単語が含まれ、apples が含まれていないため、_id: 3 を含むドキュメントが返されます。
➤ MongoDB Search Playground でこれを試してみてください。
must と should の例
次のクエリでは、must を使用して満たす必要のある検索条件を指定し、should を使用して Fuji という単語を含むドキュメントの優先設定を指定します。
このクエリでは、$project パイプライン ステージは _id を除くすべてのドキュメント フィールドを除外し、ドキュメントの関連性スコアを表示する score フィールドを追加します。
db.fruit.aggregate([ { "$search": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "Fuji", "path": "description" } }] } } }, { "$project": { "score": { "$meta": "searchScore" } } }])_id: 1 を含むドキュメントは、description フィールドに単語 Fuji が含まれており、should 句を満たしているため、スコアが高くなります。
➤ MongoDB Search Playground でこれを試してみてください。
次のクエリでは、結果内のすべてのドキュメントに対して constant スコア 3 も指定しています。このクエリでは、$project パイプライン ステージは _id を除くすべてのドキュメント フィールドを除外し、score フィールドを追加します。
db.fruit.aggregate([ { "$search": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "Fuji", "path": "description" } }], "score": { "constant": { "value": 3 } } } } }, { "$project": { "score": { "$meta": "searchScore" } } }])クエリの constant オプションによって結果内の各ドキュメントのスコアが数値 3 に置き換えられるため、両方のドキュメントは同じスコアを受け取ります。
➤ MongoDB Search Playground でこれを試してみてください。
minimumShouldMatch の例
複数の should 句を含むクエリでは、miniumumShouldMatch オプションを使用して、結果を返すために一致する必要がある句の最小数を指定できます。
次のクエリには must 句が 1 つと should 句が 2 つあり、minimumShouldMatch の値は 1 です。結果セットに含めるには、ドキュメントの description フィールドに varieties というタームが含まれている必要があり、説明フィールドに Fuji または Golden Delicious のいずれかが含まれている必要があります。
db.fruit.aggregate([ { $search: { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "Fuji", "path": "description" } }, { "text": { "query": "Golden Delicious", "path": "description" } }], "minimumShouldMatch": 1 } } }])_id: 1 の一致を含むドキュメントは、must 句と 2 つの should 句のうちの最初の句と一致します。
➤ MongoDB Search Playground でこれを試してみてください。
filter 例
filter filter 句は返されたドキュメントのスコアには考慮されないため、返されるドキュメントの順序に影響しないことを除いて must と同じように動作します。
次のクエリでは次の句を使用します。
mustそしてfilterで、満たす必要のある検索条件を指定します。shouldbananaという単語を含むドキュメントを優先するように指定します。should句にはminimumShouldMatchオプションは含まれていません。minimumShouldMatchを省略すると、デフォルトは0となります。
db.fruit.aggregate([ { "$search": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "banana", "path": "description" } }], "filter": [{ "text": { "query": "granny", "path": "description" } }] } } }])返されたドキュメントは、含めるためのすべての要件を満たしています。
must句とfilter句の両方が一致します。minimumShouldMatchの値が指定されていないため、デフォルトで0になります。その結果、should句は失敗し、ドキュメントが返されます。
➤ MongoDB Search Playground でこれを試してみてください。
$match ステージの後に $search ステージが続く場合は、マッチ条件を $search ステージ内の filter 句に移動することで、クエリパフォーマンスを向上させることができます。MongoDB Search は、結果セットを再スキャンして $match ステージを実行する代わりに、検索中に filter 条件を適用します。
次のパイプラインを考えます。これは、description フィールドで期間 varieties を検索し、次に $match と $in を使用して、リンゴとバナナのみを維持します。
db.fruit.aggregate([ { "$search": { "text": { "query": "varieties", "path": "description" } } }, { "$match": { "type": { "$in": [ "apple", "banana" ] } } }, { "$project": { "description": 1, "score": { "$meta": "searchScore" } } }])次のクエリでは、$match ステージを、type フィールドで equals 演算子を使用する filter 節に置き換えます。$search ステージは、compound 演算子を使用して次の節を結合します。
mustdescriptionフィールドのvarieties検索語句に一致する節filterappleおよびbananaタイプの合計に対する節
$project ステージでは、次の処理を実行します。
_idとdescription以外のすべてのフィールドを除外ドキュメントの関連性スコアを含む
scoreフィールドを追加します
db.fruit.aggregate([ { "$search": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "filter": [{ "in": { "path": "type", "value": [ "apple", "banana" ] } }] } } }, { "$project": { "description": 1, "score": { "$meta": "searchScore" } } }])結果に含まれるドキュメントは、含めるためのすべての要件を満たしています。
両方のドキュメントには、クエリの
filter句で指定されたtypeの値appleまたはbananaが含まれています。_id: 1を含むドキュメントは、クエリのshould句で指定されたvarietiesというタームが含まれているため、_id: 2を含むドキュメントよりもスコアが高くなります。
ネストされた例
次の例では、ネストされた compound 句を使用してクエリを構築します。この例では、fruit コレクションには type、 category、および in_stock のフィールドにインデックスがあり、そのテキスト フィールドではデフォルトのアナライザが使用されます。クエリでは、ドキュメントが次の should 句のいずれか 1 つだけを満たす必要があります。
typeフィールドにappleという単語を含めます。categoryフィールドにorganicというタームが含まれ、in_stockフィールドにtrueという値が含まれます。
db.fruit.aggregate([ { $search: { "compound": { "should": [ { "text": { "query": "apple", "path": "type" } }, { "compound": { "must": [ { "text": { "query": "organic", "path": "category" } }, { "equals": { "value": true, "path": "in_stock" } } ] } } ], "minimumShouldMatch": 1 } } }])結果に含まれるドキュメントは、含まれるためのすべての要件を満たしています。
_id: 3のあるドキュメントは、2 番目のshould句内にネストされているmust句と一致します。_id: 1のあるドキュメントは最初のshould句に一致します。
➤ MongoDB Search Playground でこれを試してみてください。
メタデータの例
次のクエリはメタデータを検索し、$searchMetaパイプラインステージ、または$searchステージの$$SEARCHMETA変数のいずれかを使用して、fruitコレクションのカテゴリの数を返します。
次のクエリは、結果にメタデータのみを返します。
db.fruit.aggregate([ { "$searchMeta": { "facet": { "operator": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "Fuji", "path": "description" } }] } }, "facets": { "categoryFacet": { "type": "string", "path": "category" } } } } }])次のクエリはメタデータと検索結果を返します。
db.fruit.aggregate([ { "$search": { "facet": { "operator": { "compound": { "must": [{ "text": { "query": "varieties", "path": "description" } }], "should": [{ "text": { "query": "Fuji", "path": "description" } }] } }, "facets": { "categoryFacet": { "type": "string", "path": "category" } } } } }, { "$limit": 2 }, { "$facet": { "docs": [ { "$project": { "type": 1, "description": 1 } } ], "meta": [ {"$replaceWith": "$$SEARCH_META"}, {"$limit": 1} ] } }, { "$set": { "meta": { "$arrayElemAt": ["$meta", 0] } } }])