定義
構文
phrase の構文は次のとおりです。
{ $search: { "index": <index name>, // optional, defaults to "default" "phrase": { "query": "<search-string>", "path": "<field-to-search>", "score": <options>, "slop": <distance-number>, "synonyms": "<synonyms-mapping-name>" } }}オプション
phrase では、次の用語を使用してクエリを作成します。
フィールド | タイプ | 説明 | 必要性 |
|---|---|---|---|
| 文字列または複数の文字列の配列 | 検索する文字列または複数の文字列。 | はい |
| 文字列または複数の文字列の配列 | 検索対象となるインデックス付きフィールド。ワイルドカード パスを指定して検索することもできます。 重要: | はい |
| integer |
| no |
| オブジェクト | 一致する検索結果に割り当てる スコア 。 デフォルトのスコアは、次のオプションを使用して変更できます。
配列値をクエリする場合、配列内のクエリに一致する値が多いほど、 MongoDB Search はより高いスコアを割り当てます。 デフォルトのスコアを変更するオプションの詳細については、「 結果内のドキュメントのスコアリング 」を参照してください。 | no |
| string | シノニム(同意語)を使用してクエリを実行するために必要です。 インデックス定義内のシノニム(同意語)マッピングの定義名。値は空の文字列にできません。 シノニム(同意語)マッピングを使用するクエリをMongoDB Search が実行するのにかかる時間は、 シノニム(同意語)ソースコレクション内のドキュメントの数とサイズによって異なります。 たとえば、非常に少ないシノニムドキュメントに基づいたシノニムマッピングを使うクエリは、多くのシノニムドキュメントに基づいたシノニムマッピングを使うクエリよりも速くなるかもしれません。 | 任意 |
スコアリングの動作
デフォルトでは、text 演算子はbm25の類似性アルゴリズムを使用して、クエリとの関連性に応じてドキュメントにスコアを付けます。
MongoDB Search インデックス定義のstringフィールドのsimilarity.typeプロパティで別の類似性アルゴリズムを指定することにより、使用する類似性アルゴリズムを変更できます。string型の MongoDB Search インデックスを設定する方法については、「文字列フィールドのインデックス作成方法」を参照してください。
サポートされている類似性アルゴリズムの詳細については、 「スコアの詳細」を参照してください。
例
このページの例では、sample_mflix データベース内の movies コレクションを使用します。サンプルデータセット をクラスターにロードしたら、動的マッピングを使用して MongoDB Search インデックスを作成し、クラスターで例クエリを実行します。シノニムの例を試すには、synonymous_terms コレクションを sample_mflix データベースに追加し、synonyms マッピングコレクションでインデックスを定義する必要があります。
単一フレーズの例
次の MongoDB Search の例では、title フィールドに対してクエリ文字列 new york の基本的な検索を実行します。クエリに slop がないため、slop の値はデフォルトで 0 になります。つまり、title フィールドには、すべての単語が同じ位置にある正確なクエリ文字列が含まれている必要があり、その場合にのみ結果に含まれます。クエリには、次のものも含まれます。
基本的な例
次のクエリは、検索条件に一致するドキュメントを返します。
db.movies.aggregate([ { "$search": { "phrase": { "path": "title", "query": "new york" } } }, { $limit: 10 }, { $project: { "_id": 0, "title": 1, score: { $meta: "searchScore" } } }])メタデータの例
次のクエリは、検索条件に一致するメタデータの結果を返します。このクエリでは $searchMeta ステージを使用して、次のバケット(年)内で検索条件に一致する映画数を取得します。
2000 (このバケットの下限値を含む)
2005: 2000 バケットの 排他的上限であり、このバケットの下限
2010: 2005 バケットの 排他的上限であり、このバケットの下限
2010: 2010 の排他的上限
例
db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "phrase": { "path": "title", "query": "new york" } }, "facets": { "yearFacet": { "type": "number", "path": "year", "boundaries": [2000, 2005, 2010, 2015 ] } } } } }])この結果からは、 2000 と 2005 の間には 3 件の映画、 2005 と 2010 の間には 8 件の映画、2010 と 2015 の間には title に用語new york を含む 4 件の映画があることがわかります。
複数フレーズの例
以下のMongoDB Searchの例では、titleフィールドでクエリ文字列the manとthe moonを検索します。クエリにslopがないため、slopの値はデフォルトで0に設定されます。これは、結果に含めるには、titleにすべての単語が同じ位置にある正確なクエリ文字列が含まれている必要があることを意味します。クエリには、次のものも含まれます。
db.movies.aggregate([ { "$search": { "phrase": { "path": "title", "query": ["the man", "the moon"] } } }, { $limit: 10 }, { $project: { "_id": 0, "title": 1, score: { $meta: "searchScore" } } }])スローの例
MongoDB Search の次の例では、クエリ文字列men women の titleフィールドを検索します。 query の 5 の slop 値により、単語の移動が大きくなり、men と women の間の距離が満たされます。クエリには、次の操作を行うための $project ステージが含まれています。
すべてのフィールドを除外。例外:
title次のフィールドを追加:
score
db.movies.aggregate([ { "$search": { "phrase": { "path": "title", "query": "men women", "slop": 5 } } }, { $project: { "_id": 0, "title": 1, score: { $meta: "searchScore" } } }])シノニム(同意語)の例
次のクエリは、moviesコレクションの plotフィールドで、指定されたクエリ文字列内のタームを検索します。 MongoDB Search では、 シノニム(同意語)ソースコレクション内の synonymous_termsマッピング タイプ (sample_mflix.movies )に基づき結果が返されます。このマッピング タイプは コレクションのインデックスのシノニム マッピング定義で指定されます。
次のクエリは、plot フィールドの任意の場所で、単語間の距離が 5 までの範囲で automobile race というフレーズを検索します。
db.movies.aggregate([ { $search: { "phrase": { "path": "plot", "query": "automobile race", "slop": 5, "synonyms": "my_synonyms" } } }, { "$limit": 5 }, { $project: { "_id": 0, "plot": 1, "title": 1, score: { $meta: "searchScore" } } }])結果に含まれる文書の plot フィールドに次の用語が含まれており、用語間の距離は最大で 5 です。
automobile、car、またはvehicleは、synonymous_termsコレクションでequivalentのシノニムとして定義されています。race、contest、またはrallyは、sy``synonymous_terms`` コレクションでexplicitシノニムとして定義されています。
MongoDB Search では、car race または vehicle race の検索でも同様の結果が返されます。これは、automobile、car、vehicle を equivalent シノニムとして設定したためです。ただし、automobile contest の結果には race または rally を持つドキュメントは含まれず、automobile rally の結果には race または contest を持つドキュメントは含まれません。これは、contest を構成しなかったためです。または rally は、任意のタームの同義語になります。