Overview
このガイドでは、 Searchビルダーを使用して MongoDB .NET/C# ドライバーで$search集計パイプライン ステージを構築する方法を学びます。
$searchパイプライン ステージの詳細については、 $search を参照してください。
注意
Atlas および Community Edition のバージョン要件
The $search aggregation-pipeline operator is available only for collections hosted on MongoDB Atlas clusters running MongoDB v4.2 or later, or on MongoDB Community Edition clusters running MongoDB v8.2 or later. Collections must be covered by a MongoDB Search index. To learn more about the required setup and the functionality of this operator, see the MongoDB Search documentation.
サンプル データ
このガイドの例では、 sample_mflixデータベースの moviesコレクションを使用します。このコレクションのドキュメントには、タイトル、プロット、ジャンル、評価など、映画に関する情報が含まれています。次の Movieクラスは、このコレクション内のドキュメントをモデル化します。
[] public class Movie { [] public ObjectId Id { get; set; } public string Title { get; set; } = null!; public string Plot { get; set; } = null!; public string[] Genres { get; set; } = null!; public int Year { get; set; } public string Rated { get; set; } = null!; public Imdb Imdb { get; set; } = null!; [] public float[] PlotEmbedding { get; set; } = null!; public double Score { get; set; } [] [] public SearchScoreDetails ScoreDetails { get; set; } = null!; [] public string PaginationToken { get; set; } = null!; }
Movieクラスは次の Imdbクラスを参照します。このクラスは、各ドキュメント内のネストされた imdbフィールドをモデル化します。
[] public class Imdb { public double Rating { get; set; } public int Votes { get; set; } public int Id { get; set; } }
注意
サンプル データ内のキャメルケースのフィールド名
movies コレクションのドキュメントは、キャメル ケースの命名規則を使用します。このガイドの例では、ConventionPack を使用してコレクション内のフィールドをパスカル ケースに逆シリアル化し、Movie クラスのプロパティにマップします。
カスタム直列化について詳しくは、「カスタム直列化」を参照してください。
Some examples in this guide use additional collections and model classes, which the relevant sections introduce. All collections are from the sample datasets provided by Atlas. See Get Started with the .NET/C# Driver to learn how to create a free MongoDB cluster and load this sample data.
注意
サンプル データで一貫性のないフィールド型
moviesコレクション内の一部のドキュメントでは、imdb.rating フィールドと imdb.votes フィールドが数値ではなく文字列として保存されています。モデルクラスでこれらのフィールドを double または int として定義すると、ドライバーはそれらのドキュメントを逆直列化するときに FormatException をスローします。
混合フィールド型のドキュメントを処理するには、複数のBSON型を受け入れるカスタム シリアライザーを実装し、影響を受けるプロパティに [BsonSerializer] 属性を使用して適用します。
[] public class Imdb { [] public double Rating { get; set; } [] public int Votes { get; set; } public int Id { get; set; } }
FlexibleDoubleSerializer などのカスタム シリアライザーを実装する方法については、カスタム シリアライザー を参照してください。
MongoDB Search インデックスの作成
Atlasコレクションで検索を実行する前に、まずコレクションに検索インデックスを作成する必要があります。MongoDB 検索インデックスは、検索可能な形式でデータを分類するデータ構造です。
MongoDB 検索インデックスの作成方法については、MongoDB 検索インデックスの作成ガイドを参照してください。
MongoDB 検索する 演算子とコレクター
The Search class contains methods you can use to perform $search operations. For a full list of available $search operators and collectors, see the Operators and Collectors Atlas guide.
オートコンプリート
Autocomplete()メソッドを使用して、不完全な入力 string からの文字シーケンスを含む単語またはフレーズを検索します。
次の例では、string "Gravity" で始まるテキストの titleフィールドに対してオートコンプリート クエリを実行します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Autocomplete(m => m.Title, "Gravity"), indexName: "movietitles") .ToList();
autocomplete演算子の詳細については、Atlas のオートコンプリートガイドを参照してください。
注意
オートコンプリート クエリ用インデックス
オートコンプリート クエリを正常に実行するには、オートコンプリートをサポートするMongoDB 検索インデックスを作成する必要があります。詳細を学ぶには、Atlas ドキュメントのオートコンプリート用にフィールドをインデックスする方法を参照してください。
MongoDB Searchインデックスを作成したら、前述の例に示すように、インデックス名を Autocomplete() メソッドに渡す必要があります。
複合
2 つ以上の演算子を 1 つの検索に結合するには、 Compound()メソッドを使用します。
次の例では、movies コレクション内で次のすべての条件に一致するドキュメントを検索します。
imdb.ratingフィールドはドキュメントに存在するratedフィールド値は"G"ではありませんyearフィールドの値が 2000 より大きい
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Compound() .Must(Builders<Movie>.Search.Exists(m => m.Imdb.Rating)) .MustNot(Builders<Movie>.Search.Equals(m => m.Rated, "G")) .Must(Builders<Movie>.Search.Range(m => m.Year, SearchRangeBuilder.Gt(2000)))) .ToList();
compound演算子の詳細については、 Atlas複合ガイド をご覧ください。
embeddedDocument
EmbeddedDocument()メソッドを使用して、フィールドの配列値内のドキュメントに対して検索操作を実行します。
注意
必須の埋め込みドキュメントインデックス
埋め込みドキュメントを検索するには、配列フィールドにembeddedDocumentインデックスを作成する必要があります。
embeddedDocumentインデックスを定義する方法については、Atlas ドキュメントの「 embeddedDocument 型のインデックスの定義」を参照してください。
この節の例は、sample_restaurantsデータベースのrestaurantsコレクションを使用しています。次のクラスは、そのコレクション内のドキュメントをモデル化します。
[] public class Restaurant { [] public ObjectId Id { get; set; } public string Name { get; set; } = null!; public string Cuisine { get; set; } = null!; public string Borough { get; set; } = null!; public List<GradeEntry> Grades { get; set; } = null!; }
[] public class GradeEntry { public string Grade { get; set; } = null!; public int? Score { get; set; } }
次の例では、そのコレクションで、grades 配列に grade フィールドの値が "A" であるエントリが含まれているレストランを検索します。
var result = restaurantsCollection.Aggregate() .Search(Builders<Restaurant>.Search.EmbeddedDocument( r => r.Grades, Builders<GradeEntry>.Search.Equals(g => g.Grade, "A") ), indexName: "restaurantsembedded").ToList();
To learn more about the embeddedDocument operator, see the embeddedDocument Atlas guide.
以下のセクションでは、埋め込みドキュメント検索を拡張するために使用できる追加のパラメータと演算子について説明します。
returnScope パラメーター
returnScope パラメーターを Search() または SearchMeta() メソッドで使用して、配列フィールドから埋め込みドキュメントをルートレベルのドキュメントの代わりに個別の結果として返します。returnScope を指定すると、MongoDB Search は各埋め込みドキュメントを独立してスコアし、ソートし、カウントします。
このパラメーターは、埋め込みドキュメントを含む配列フィールドへのパスを指定する Lambda 式を受け付けます。
returnScope を使用するには、次の手順を実行する必要があります。
配列フィールドのインデックスでは、
embeddedDocuments型としてインデックス化します。取得したい入れ子フィールドに対して、インデックス定義でstoredSource オプションを設定します。
検索オプションで
ReturnStoredSourceをtrueに設定してください。
次の例では、restaurants コレクションから、grades 配列の中に "A" の値を持つドキュメントを取得します。コードは r => r.Grades 式を Search() メソッドに returnScope パラメーターとして渡し、ドライバーに grades 配列内の埋め込みドキュメントを個別の結果として返すよう指示します。
var result = restaurantsCollection.Aggregate() .Search( Builders<Restaurant>.Search.Equals("grades.grade", "A"), r => r.Grades, new SearchOptions<Restaurant> { ReturnStoredSource = true, IndexName = "restaurantsembedded" }) .ToList();
詳細については、Atlas ドキュメントの fts-return-scope を参照してください。
HasAncestor
Use the HasAncestor() method inside an EmbeddedDocument() query to filter on a field at an intermediate ancestor level of nesting. An ancestor field is an embeddedDocuments type field that is a parent of the embedded field that you specify in the returnScope parameter but is not the root document.
次のパラメータをHasAncestor()メソッドに渡します。
Parameter | 必須 | 説明 |
|---|---|---|
| はい | 祖先フィールドへのパス |
| はい | 祖先フィールド内のフィールドに適用する検索演算子 |
| No | 検索結果に適用するスコア修飾子 |
学ぶためには、Atlas ドキュメントの has-ancestor-ref を参照してください。
HasRoot
埋め込みドキュメント検索を実行する際に、ルートレベルのフィールドでフィルタリングするには、HasRoot() メソッドを EmbeddedDocument() クエリ内で使用します。
次のパラメータをHasRoot()メソッドに渡します。
Parameter | 必須 | 説明 |
|---|---|---|
| はい | ルートレベルのフィールドに適用する検索演算子。 |
| No | 検索結果に適用するスコア修飾子。 |
次の例では、restaurants コレクションから、grades 配列内に少なくとも 1 つの"A" 値を持つドキュメントを検索します。クエリは、HasRoot() メソッドを使用して、ルートレベルの borough フィールドで "Manhattan" の値を絞り込みます。
var result = restaurantsCollection.Aggregate() .Search( Builders<Restaurant>.Search.EmbeddedDocument<Restaurant>( "grades", Builders<Restaurant>.Search.Compound() .Must( Builders<Restaurant>.Search.HasRoot( Builders<Restaurant>.Search.Equals(r => r.Borough, "Manhattan")), Builders<Restaurant>.Search.Equals("grade", "A"))), new SearchOptions<Restaurant> { IndexName = "restaurantsembedded" }) .ToList();
詳細については、Atlas ドキュメントの has-root-ref を参照してください。
equals
フィールドが指定された値と一致するかどうかを確認するには、 Equals()メソッドを使用します。
次の例では、 moviesコレクションで、yearフィールドの値が 2000 であるドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Equals(m => m.Year, 2000)) .ToList();
equals演算子の詳細については、 Atlas ガイドと等価を参照してください。
exists
指定されたインデックス付きフィールド名が存在するドキュメントを検索するには、Exists() メソッドを使用します。指定されたフィールドが存在してもインデックスが作成されていない場合、ドキュメントは結果セットに含まれません。
次の例では、moviesコレクションで imdb.ratingフィールドが存在するドキュメントを検索します。検索では、imdb.ratingフィールドが存在するすべてのドキュメントが返されます。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Exists(m => m.Imdb.Rating)) .ToList();
To learn more about the exists operator, see the exists Atlas guide.
Facet
Facet() メソッドを使用して、指定されたファセットフィールドの値または範囲で結果をグループ化し、各グループのカウントを返します。
You can use the Facet() method with both the $search and $searchMeta stages. MongoDB recommends using facet with the $searchMeta stage to retrieve metadata results only for the query. To retrieve metadata results and query results using the $search stage, you must use the $$SEARCH_META aggregation variable. To learn more about this variable, see the SEARCH_META Aggregation Variable Atlas guide.
次の制限が適用されます。
ファセット クエリは単一のフィールドに対してのみ実行できます。フィールドのグループに対してファセット クエリを実行することはできません。
MongoDB v6.0 を実行しているクラスター上のシャーディングされたコレクションに対してのみファセット クエリを実行できます。
次の例では、moviesコレクションで、yearフィールドの値が 2000 以上のドキュメントを検索します。クエリは Facet() メソッドを使用して入力ドキュメントを処理します。genresフィールドに基づいて結果に返す最大数の 100ファセットカテゴリが含まれます。クエリは、見つかった個別のジャンルの数を返します。
var result = moviesCollection.Aggregate() .SearchMeta( Builders<Movie>.Search.Facet( Builders<Movie>.Search.Range(m => m.Year, SearchRangeBuilder.Gte(2000)), Builders<Movie>.SearchFacet.String("genres", m => m.Genres, 100)), indexName: "moviesfacetsearch") .Single() .Facet["genres"].Buckets.Count();
facetコレクターの詳細については、「ファセットAtlas ガイド」を参照してください。
geoShape
GeoShape()メソッドを使用して、特定のジオメトリに関連するドキュメントを検索します。 検索する座標を指定する場合は、最初に 経度 、次に 緯度 を指定する必要があります。 経度の値は、両端を含む-180から180までです。 緯度の値は、両端を含む-90から90までです。
注意
MongoDB Search は以下の機能をサポートしていません。
非デフォルトの座標参照システム(CRS)
平面 XY 座標系 (2 次元)
座標ペアのポイント表記(pointFieldName: [12, 34])
この例では、sample_mflixデータベースの theatersコレクションを使用します。次の クラスは、そのコレクション内のドキュメントをモデル化します。
[] public class Theater { [] public ObjectId Id { get; set; } public int TheaterId { get; set; } public TheaterLocation Location { get; set; } = null!; }
[] public class TheaterLocation { [] public GeoJsonPoint<GeoJson2DGeographicCoordinates> Geo { get; set; } = null!; }
次の例では、そのコレクションで、location.geoフィールドの座標が最小値 MN 領域内の指定された多角形と交差されているすべてのドキュメントを検索します。
GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[] { new(-93.5, 44.7), new(-93.5, 45.0), new(-93.0, 45.0), new(-93.0, 44.7), new(-93.5, 44.7), }))); var result = theatersCollection.Aggregate() .Search(Builders<Theater>.Search.GeoShape( t => t.Location.Geo, GeoShapeRelation.Intersects, searchArea), indexName: "theatersgeo") .ToList();
geoShape演算子の詳細については、 geoShape Atlas ガイドを参照してください。
geoWithin
Use the GeoWithin() method to search for documents in which the coordinates of their specified GeoJSON field are within a given geometry. You can search for points that are within a:
円
境界ボックス
多角形
検索する座標を指定する場合は、最初に 経度 、次に 緯度 を指定する必要があります。 経度の値は、両端を含む-180から180までです。 緯度の値は、両端を含む-90から90までです。
注意
MongoDB Search は以下の機能をサポートしていません。
非デフォルトの座標参照システム(CRS)
平面 XY 座標系 (2 次元)
座標ペアのポイント表記(pointFieldName: [12, 34])
次の例では、 theatersコレクションで、location.geoフィールドの座標が指定された多角形内にあるすべてのドキュメントを検索します。
GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[] { new(-94.0, 44.5), new(-94.0, 45.2), new(-92.5, 45.2), new(-92.5, 44.5), new(-94.0, 44.5), }))); var result = theatersCollection.Aggregate() .Search(Builders<Theater>.Search.GeoWithin(t => t.Location.Geo, searchArea), indexName: "theatersgeo") .ToList();
To learn more about the geoWithin operator, see the geoWithin Atlas guide.
で
指定値のリストと一致するフィールド値を持つドキュメントを検索するには、In() メソッドを使用します。
次の例では、 moviesコレクションで、"Action" または "Comedy" のいずれかを含む genres 配列を持つドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.In(m => m.Genres, new[] { "Action", "Comedy" })) .ToList();
moreLikeThis
入力ドキュメントに類似するドキュメントを検索するには、 MoreLikeThis()メソッドを使用します。
この例では、次のクラスを使用して、検索の入力ドキュメントを指定します。
public class MovieSearch { public string Plot { get; set; } = null!; }
次の例では、 moviesコレクションで、plotフィールドの値が "time travel" であるオブジェクトに類似するドキュメントを検索します。
var searchDocument = new MovieSearch() { Plot = "time travel", }; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.MoreLikeThis(searchDocument)) .ToList();
To learn more about the moreLikeThis operator, see the moreLikeThis Atlas guide.
near
Near()メソッドを使用して、指定したフィールドが指定の値に近いドキュメントを検索します。 検索は、次に対して実行できます。
数値フィールド
日付フィールド
地理的ポイント
次の例では、 moviesコレクションで、imdb.ratingフィールドの値が 8.5 に近いドキュメントを検索します。値が 8.5 に近いかどうかに基づいて、ドキュメントは順番に返されます。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Near(m => m.Imdb.Rating, 8.5, 1)) .ToList();
To learn more about the near operator, see the near Atlas guide.
phrase
指定したフィールドに入力stringが含まれているドキュメントを検索するには、Phrase() メソッドを使用します。
次の例では、 moviesコレクションで、plotフィールドにフレーズ "time travel" が含まれているドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Phrase(m => m.Plot, "time travel")) .ToList();
また、コレクション内で plotフィールドで "time travel" または "space adventure" のいずれかを含むドキュメントを検索することもできます。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Phrase(m => m.Plot, new List<string>() { "time travel", "space adventure" })) .ToList();
To learn more about the phrase operator, see the phrase Atlas guide.
queryString
QueryString()メソッドを使用して、次の演算子と区切り文字を含む string を使用してドキュメントを検索します。
ANDORNOT()
次の例では、 moviesコレクションで、 plotフィールドの値が次の各条件に一致するドキュメントを検索します。
string
"time"または string"space"が含まれますstring を含みません
"comedy"
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.QueryString(m => m.Plot, "(time OR space) AND NOT comedy")) .ToList();
To learn more about the queryString operator, see the queryString Atlas guide.
Range(範囲)
Range() メソッドを使用して、指定フィールドの値が特定の数値、日付、または文字列の範囲内にあるドキュメントを検索します。
次の例では、 moviesコレクションで、year の値が 2000 より大きく 2010 より小さいすべてのドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search .Range(m => m.Year, SearchRangeBuilder.Gt(2000).Lt(2010))) .ToList();
指定したフィールドの値が string の範囲内にあるドキュメントを検索するには、まずフィールドに トークンインデックスを作成する必要があります。インデックスを作成 したら、string の範囲に基づいてドキュメントを検索できます。次の例では、title フィールドの値が"A" と の間にあるドキュメントを辞書順に比較して返します。"G"
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search .Range(m => m.Title, SearchRangeV2Builder.Gte("A").Lte("G"))) .ToList();
range演算子の詳細については、 Atlas の範囲ガイド を参照してください。
regex
正規表現を使用してドキュメントを検索するには、 Regex()メソッドを使用します。
次の例では、 moviesコレクションで、titleフィールドの値に 6 文字だけが含まれているドキュメントを検索します。
var regex = "[A-Za-z]{6}"; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Regex(m => m.Title, regex, allowAnalyzedField: true)) .ToList();
注意
分析されたフィールドでの正規表現の実行
デフォルトでは 、regex 演算子は 分析対象フィールドでは実行できません。次のように、allowAnalyzedField オプションを true に設定することで、分析するフィールドで実行することができます。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Regex(m => m.Title, regex, allowAnalyzedField: true)) .ToList();
Setting the allowAnalyzedField option to true may lead to unexpected search results. To learn more, see Behavior in the Atlas regex guide.
regex演算子の詳細については、 Atlas ガイドの正規表現を参照してください。
span
フィールドのリージョン内に一致するテキスト検索を検索するには、 Span()メソッドを使用します。 このメソッドを使用すると、指定した精度で相互に近い文字列を検索できます。
注意
Span 演算子のパフォーマンス
span演算子は、クエリが位置情報を追跡する必要があるため、他の演算子よりも計算負荷が高くなります。
次の例では、moviesコレクションで、plotフィールドの値に"time"と"travel"が互いに1単語以内に含まれるドキュメントを検索します。
var searchTerms = new[] { Builders<Movie>.SearchSpan.Term(m => m.Plot, "time"), Builders<Movie>.SearchSpan.Term(m => m.Plot, "travel") }; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Span(Builders<Movie>.SearchSpan.Near(searchTerms, 1))) .ToList();
span演算子の詳細については、 Atlas ガイドの範囲を参照してください。
Text
ドキュメント内で指定された string または string の配列を検索するには、Text() メソッドを使用します。特定の string に複数の検索期間がある場合、 MongoDB Search は 文字列内の各期間の一致も個別に検索します
次の例では、 moviesコレクションで、plotフィールドの値に string "secret agent" が含まれるドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text(m => m.Plot, "secret agent")) .ToList();
Tip
マルチターム検索の動作
検索 string に複数のタームが含まれている場合、このメソッドは string 内の各タームの一致も個別に検索します
To learn more about the text operator, see the text Atlas guide.
ワイルドカード
Wildcard() メソッドを使用して、検索stringに任意の文字に一致する特殊文字を使用してドキュメントを検索します。 検索では、次の文字を使用できます。
文字 | 説明 |
|---|---|
| 任意の 1 文字と一致 |
| 0 文字以上の文字と一致 |
| エスケープ文字 |
次の例では、 titleフィールドの値に string "Amer" とそれに続く他の文字が含まれているドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Wildcard(m => m.Title, "Amer*", allowAnalyzedField: true)) .ToList();
注意
分析対象フィールドでのワイルドカードの実行
デフォルトでは 、wildcard 演算子は 分析対象フィールドでは実行できません。次のように、allowAnalyzedField オプションを true に設定することで、分析フィールドで実行できるようになります。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Wildcard(m => m.Title, "Amer*", allowAnalyzedField: true)) .ToList();
allowAnalyzedFieldオプションを true に設定すると、予期しない検索結果が発生する可能性があります。 詳しくは、「ワイルドカードの動作 」を参照してください。
To learn more about the wildcard operator, see the wildcard Atlas guide.
検索パスの指定
検索するフィールドへのパスは、SearchPathDefinitionBuilderクラスを使用して指定できます。Builders<TDocument>.SearchPath を使用して SearchPathDefinitionBuilderインスタンスにアクセスし、そのメソッドの 1 つを呼び出して検索パスを指定します。次のセクションでは、利用可能なメソッドについて説明します。
シングル フィールド
検索パスとして 1 つのフィールドを指定するには、Single() メソッドを使用します。次の例は、フィールドを指定する 3 つの方法です。型指定されたモデルでラムダ式を使用する、実行時に値が既知であるfieldName変数やメソッド パラメータなどの文字列フィールド名を渡します、または型指定されていないドキュメントを使用します。
注意
The field that you pass to the Single() method must be included in the search index definition. If the field isn't included, MongoDB Server returns an empty result set without returning an error.
Lambda式
型付きモデルを操作していて、コンパイル時にフィールド名がわかっている場合は、 lambda 式を使用します。この形式では、コンパイル時に型をチェックできます。
次の例では、 plotフィールドでテキスト "secret agent" を含むドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text( Builders<Movie>.SearchPath.Single(m => m.Plot), "secret agent")) .ToList();
string フィールド名
型付きモデルを操作しているが、コンパイル時にフィールド名が不明な場合は、FieldDefinition<TDocument> を使用します。ユーザー入力または構成ファイルからフィールド名を検索する場合は、この形式の使用を検討してください。
次の例ではフィールド名を FieldDefinition<Movie> 変数に割り当て、それを Single() に渡します。
FieldDefinition<Movie> runtimeField = fieldName; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text( Builders<Movie>.SearchPath.Single(runtimeField), "secret agent")) .ToList();
BsonDocument
型指定されたモデルではなく BsonDocument オブジェクトを操作する場合は、フィールド名を string として指定する必要があります。
次の例では、型なしのコレクションで、テキスト "secret agent" を含むドキュメントを plotフィールドで検索します。
var result = moviesCollectionBson.Aggregate() .Search(Builders<BsonDocument>.Search.Text( Builders<BsonDocument>.SearchPath.Single("plot"), "secret agent")) .ToList();
複数のフィールド
複数のフィールドの検索パスを指定するには、Multi() メソッドを使用します。結果セットには、指定されたフィールドのいずれかに一致するドキュメントが含まれます。
注意
You must include all fields that you pass to the Multi() method in the search index definition. If you pass a field that isn't included, MongoDB Server silently excludes it from the search.
次の例では、plot または titleフィールドのいずれかでフレーズ "time travel" を検索します。
var result = moviesCollection.Aggregate().Search( Builders<Movie>.Search.Phrase(Builders<Movie>.SearchPath .Multi(m => m.Plot, m => m.Title), "time travel"), indexName: "moviesmulti") .ToList();
analyzer
Analyzers process text into searchable tokens by applying operations such as lowercasing. MongoDB Server applies an analyzer when indexing a field and again when running a query against that field. If you specify the multi option when you create a search index, MongoDB Server also stores a second set of tokens produced by an alternate analyzer.
Analyzer() メソッドを使用すると、フィールドのデフォルトのアナライザによって生成されたトークンではなく、multiアナライザによって生成されたトークンに対してクエリを実行できます。Analyzer() に渡す名前は、基礎のアナライザの名前ではなく、インデックス定義内の multi ブロックのキー名である必要があります。
次の例では、"lucene" という名前の multiアナライザを使用して、titleフィールドでテキスト "gravity" を含むドキュメントを検索しています。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text( Builders<Movie>.SearchPath.Analyzer(m => m.Title, "lucene"), "gravity"), indexName: "moviesanalyzer") .ToList();
ワイルドカード パス
フィールド名を一致させるためにワイルドカード文字を使用する検索パスを指定するには、Wildcard() メソッドを使用します。フィールド名の * 文字を使用して、任意の文字シーケンスを一致させることができます。
MongoDB Server は、次の条件を満たすフィールドのみを検索します。
フィールドはインデックスを付ける必要があります。
フィールド名は指定されたパターンと一致する必要があります。
フィールドのデータ型は検索演算子と一致する必要があります。例、
Text()クエリは string フィールドのみを検索します。
次の例では、名前が "p" で始まるすべてのフィールドで、"secret agent" というテキストを含むドキュメントを検索します。
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text( Builders<Movie>.SearchPath.Wildcard("p*"), "secret agent")) .ToList();
注意
ワイルドカード パフォーマンス
"*" などの幅広いパターンはすべてのインデックス付きフィールドに一致するため、大規模なインデックスではクエリ パフォーマンスに影響を与える可能性があります。
To learn more about wildcard paths, see Construct a Query Path in the Atlas documentation.
スコアのドキュメント
MongoDB Server assigns a relevance score to every document that it returns from a MongoDB Search query. The query returns the documents in order from highest score to lowest. To learn more about how scores are assigned, see the score Atlas guide.
返されたドキュメントに割り当てられるスコアは、ドキュメントのメタデータの一部です。集計パイプラインで $project ステージを使用すると、返された各ドキュメントのスコアを結果セットに含めることができます。
次の例では、 moviesコレクションで、titleフィールドの値に 6 文字だけが含まれているドキュメントを検索し、$project ステージを使用して返されるドキュメントに score という名前のフィールドを追加します。
var regex = "[A-Za-z]{6}"; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Regex(m => m.Title, regex, allowAnalyzedField: true), indexName: "moviescore") .Project<Movie>(Builders<Movie>.Projection .Include(m => m.Id) .Include(m => m.Title) .Include(m => m.Plot) .MetaSearchScore(m => m.Score)) .ToList();
MongoDB 検索するの動作を変更する
SearchOptionsオブジェクトをパラメーターとして渡すことで、Search() メソッドの動作を変更できます。
SearchOptionsクラスには、次のプロパティが含まれています。
プロパティ | 説明 |
|---|---|
| 検索結果をカウントするオプション。 データ型: SearchCountOptions |
| 元のコンテキストで検索期間を表示するためのオプション。 データ型: SearchHighlightOptions<TDocument> |
| 検索に使用するインデックス。 Data type: |
| データベースでドキュメント全体を検索するか、MongoDB Search から直接保存されたソース フィールドのみを返すかを指定するフラグです。 Data type: |
| 結果内の各ドキュメントのスコアに関する詳細情報を返すかどうかを指定するフラグ。 Data type: |
| ページ分けの開始点。設定すると、検索は指定された参照点の直後からドキュメントを検索します。 Data type: |
| ページ分けの終点。設定すると、指定された参照点の直前からドキュメントの検索が開始されます。 Data type: |
| 結果に適用するソート条件。 Data type: SortDefinition<TDocument> |
| 検索期間を追跡するためのオプション。 データ型: SearchTrackingOptions |
SearchAfter の例
次の例では、次のアクションを実行してMongoDB検索する操作の結果をページ分割します。
MetaSearchSequenceToken()ビルダ メソッドを使用するプロジェクションを定義します。このメソッドでは、基準点を含むPaginationTokenを指定しますSearchOptionsインデックスとソート条件を設定する SearchOptions インスタンスを作成します。初期検索を実行して、
plotフィールド値に"time travel"というテキストを含むドキュメントを見つけ、プロジェクションとオプションを操作に適用します。同じ
SearchOptionsインスタンスのSearchAfterプロパティを設定し、基本検索の最初の結果の後に次の検索を開始するように指示します。同じ一致条件を持つ別の検索操作を実行し、検索オプションを適用して結果をページネーションします
var projection = Builders<Movie>.Projection .Include(x => x.Title) .MetaSearchSequenceToken(x => x.PaginationToken); var searchDefinition = Builders<Movie>.Search.Text(m => m.Plot, "time travel"); var searchOptions = new SearchOptions<Movie> { IndexName = "default", Sort = Builders<Movie>.Sort.Ascending(m => m.Id) }; // Runs the base search operation var baseSearchResults = moviesCollection.Aggregate() .Search(searchDefinition, searchOptions) .Project<Movie>(projection) .ToList(); if (baseSearchResults.Count == 0) return baseSearchResults; // Sets the starting point for the next search searchOptions.SearchAfter = baseSearchResults[0].PaginationToken; var result = moviesCollection.Aggregate() .Search(searchDefinition, searchOptions) .Project<Movie>(projection) .ToList();
Tip
ページ分割のドキュメント
To learn more about MongoDB Search pagination, see Paginate the Results in the Atlas documentation.