Docs Menu
Docs Home
/ / /
C#/.NET ドライバー

Atlas Search

このガイドでは、 Searchビルダーを使用して MongoDB .NET/C# ドライバーで$search集計パイプライン ステージを構築する方法を学びます。

$searchパイプライン ステージの詳細については、 $search を参照してください。

注意

MongoDB v4.2 以降の Atlas でのみ利用可能

$search集計パイプライン演算子は、 インデックスMongoDB Atlas によってカバーされるMongoDB v4.2 以降を実行しているAtlas Search クラスターでホストされているコレクションでのみ使用できます。必要な設定とこの演算子の機能の詳細については、 Atlas Searchのドキュメントを参照してください。

このガイドの例では、 guitarsというコレクション内の次のドキュメントを使用します。

{ "_id": 1, "make": "Fender", "description": "Classic guitars known for their versatility.", "establishedYear": 1946, "in_stock": true, "rating": 9 }
{ "_id": 2, "make": "Gibson", "description": "Classic guitars known for their rich, full tones.", "establishedYear": 1902, "in_stock": true, "rating": 8 }
{ "_id": 3, "make": "PRS", "description": "High-end guitars known for their quality.", "establishedYear": 1985, "in_stock": true, "rating": 9 }
{ "_id": 4, "make": "Kiesel", "description": "Quality guitars made only for custom orders.", "establishedYear": 2015, "in_stock": false }
{ "_id": 5, "make": "Ibanez", "description": "Well-crafted guitars used by many professional guitarists.", "establishedYear": 1957, "in_stock": true, "rating": 7 }
{ "_id": 6, "make": "Strandberg", "description": "Modern guitars known for their headless models.", "establishedYear": 1982, "in_stock": false }

次のGuitarクラスは、このコレクション内のドキュメントをモデル化します。

public class Guitar
{
public int Id { get; set; }
public string Make { get; set; }
public string Description { get; set; }
public int EstablishedYear { get; set; }
[BsonElement("in_stock")]
public bool InStock { get; set; }
[BsonElement("in_stock_location")]
public Location InStockLocation { get; set; }
public int? Rating { get; set; }
public double Score {get; set;}
[BsonElement("paginationToken")]
public string PaginationToken { get; set; }
}

注意

guitars コレクションのドキュメントは、キャメル ケースの命名規則を使用します。このガイドの例では、ConventionPack を使用してコレクション内のフィールドをパスカル ケースに逆シリアル化し、Guitar クラスのプロパティにマップします。

カスタム直列化について詳しくは、「 カスタム直列化 」を参照してください。

Atlas コレクションで検索を実行する前に、まずコレクションにAtlas Search インデックスを作成する必要があります。 Atlas Search インデックスは、検索可能な形式でデータを分類するデータ構造です。

Atlas Search インデックスの作成方法については、「 Atlas Search インデックス Atlas の作成 」ガイドを参照してください。

Searchクラスには、$search 操作を実行するために使用できるメソッドが含まれています。使用可能な $search 演算子とコレクターの完全なリストについては、Atlas の演算子とコレクターに関するガイドを参照してください。

Autocomplete()メソッドを使用して、不完全な入力 string からの文字シーケンスを含む単語またはフレーズを検索します。

次の例では、make フィールドで "Gib" で始まる文字列に対してオートコンプリート クエリを実行します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Autocomplete(g => g.Make, "Gib"), indexName: "guitarmakes")
.ToList();

注意

オートコンプリート クエリ用インデックス

オートコンプリート クエリを正常に実行するには、オート コンプリートをサポートする Atlas Search インデックスを作成する必要があります。詳細については、Atlas ドキュメントの「オートコンプリートのためのフィールドのインデックス作成方法」を参照してください。

Atlas Search インデックスを作成した後、前述のコードに示すように、インデックス名をAutocomplete()メソッドに渡す必要があります。

検索では、次のドキュメントが返されます。

{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }

autocomplete演算子の詳細については、Atlas のオートコンプリートガイドを参照してください。

2 つ以上の演算子を 1 つの検索に結合するには、 Compound()メソッドを使用します。

次の例では、guitarsコレクションで次のすべての条件に一致するドキュメントを検索します。

  • ratingフィールドはドキュメントに存在する

  • in_stockフィールドはfalseではありません

  • establishedYearフィールドの値が 1940 より大きい

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Compound()
.Must(Builders<Guitar>.Search.Exists(g => g.Rating))
.MustNot(Builders<Guitar>.Search.Equals(g => g.InStock, false))
.Must(Builders<Guitar>.Search.Range(g => g.EstablishedYear, SearchRangeBuilder.Gt(1940))))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 }
{ "_id" : 3, "make" : "PRS", "description" : "...", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 }
{ "_id" : 5, "make" : "Ibanez", "description" : "...", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }

compound演算子の詳細については、 Atlas複合ガイド をご覧ください。

EmbeddedDocument()メソッドを使用して、フィールドの配列値内のドキュメントに対して検索操作を実行します。

注意

埋め込みドキュメントを検索するには、配列フィールドにembeddedDocumentインデックスを作成する必要があります。

embeddedDocumentインデックスを定義する方法については、Atlas ドキュメントの「 embeddedDocument 型のインデックスの定義」を参照してください。

guitarsコレクション内の一部のドキュメントには、製品詳細オブジェクトの配列を保持するproductDetailsフィールドが追加されているとします。

{ "_id": 1, "make": "Fender", "description": "...", "establishedYear": 1946, "in_stock": true, "rating": 9, "productDetails": [{"product_id": 1234, "serial": "YZ5678"}] }
{ "_id": 2, "make": "Gibson", "description": "...", "establishedYear": 1902, "in_stock": true, "rating": 8 }
{ "_id": 3, "make": "PRS", "description": "...", "establishedYear": 1985, "in_stock": true, "rating": 9, "productDetails": [{"product_id": 9870, "serial": "AB5555"}] }
{ "_id": 4, "make": "Kiesel", "description": "...", "establishedYear": 2015, "in_stock": false }
{ "_id": 5, "make": "Ibanez", "description": "...", "establishedYear": 1957, "in_stock": true, "rating": 7, "productDetails": [{"product_id": 5432, "serial": "ZZ1234"}] }
{ "_id": 6, "make": "Strandberg", "description": "...", "establishedYear": 1982, "in_stock": false }

productDetailsフィールドにembeddedDocumentインデックスを作成すると、そのフィールド内のドキュメントに対して Atlas Search 操作を実行できます。 次の例では、 productDetails配列フィールドでテキスト検索を実行し、 serialフィールド値が"YZ5678"であるドキュメントを返します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.EmbeddedDocument(
g => g.ProductDetails,
Builders<ProductDetails>.Search.Text(p => p.Serial, "YZ5678")
)).ToList();
return result;

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9, "productDetails" : [{ "product_id" : 1234, "serial" : "YZ5678" }] }

embeddedDocument演算子の詳細については、 embeddedDocument Atlas のガイドを参照してください。

フィールドが指定された値と一致するかどうかを確認するには、 Equals()メソッドを使用します。

次の例では、 guitarsコレクションで、 in_stockフィールドの値がtrueであるドキュメントを検索します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Equals(g => g.InStock, true))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 }
{ "_id" : 2, "make" : "Gibson", "description" : "...", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }
{ "_id" : 3, "make" : "PRS", "description" : "...", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 }
{ "_id" : 5, "make" : "Ibanez", "description" : "...", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }

equals演算子の詳細については、 Atlas ガイドと等価を参照してください。

指定されたインデックス付きフィールド名が存在するドキュメントを検索するには、 Exists()メソッドを使用します。 指定されたフィールドが存在してもインデックスがない場合、ドキュメントは結果セットに含まれません。

次の例では、 guitarsコレクションでratingフィールドが存在するドキュメントを検索します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Exists(g => g.Rating))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 }
{ "_id" : 2, "make" : "Gibson", "description" : "...", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }
{ "_id" : 3, "make" : "PRS", "description" : "...", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 }
{ "_id" : 5, "make" : "Ibanez", "description" : "...", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }

exists演算子の詳細については、既存のAtlasガイドを参照してください。

Facet() メソッドを使用して、指定されたファセットフィールドの値または範囲で結果をグループ化し、各グループのカウントを返します。

Facet() メソッドは、$search ステージと $searchMeta ステージの両方で使用できます。MongoDB、クエリのみのメタデータ結果を検索するために、 $searchMeta ステージでファセットを使用することを推奨しています。$search ステージを使用してメタデータ結果とクエリ結果を検索するには、$$SEARCH_META集計変数を使用する必要があります。この変数の詳細については、SEARCH_META 集計変数 Atlasガイド を参照してください。

次の制限が適用されます。

  • ファセット クエリは単一のフィールドに対してのみ実行できます。フィールドのグループに対してファセット クエリを実行することはできません。

  • MongoDB v6.0 を実行しているクラスター上のシャーディングされたコレクションに対してのみファセット クエリを実行できます。

次の例では、guitars コレクション内で、in_stock フィールドの値が true であるドキュメントを検索します。このクエリでは、Facet() メソッドを使用して入力ドキュメントを処理し、結果に返すファセットカテゴリの最大数は 100 です。このクエリは、in_stock の値が true であるドキュメントの総数を返します。

var result = guitarsCollection.Aggregate()
.SearchMeta(
Builders<Guitar>.Search.Facet(
Builders<Guitar>.Search.Equals(g => g.InStock, true),
Builders<Guitar>.SearchFacet.String("string", g => g.Make, 100)),
indexName: "guitarfacetsearch")
.Single()
.Facet["string"].Buckets.Count();

検索では、次の結果が返されます。

4

facetコレクターの詳細については、「ファセットAtlas ガイド」を参照してください。

GeoShape()メソッドを使用して、特定のジオメトリに関連するドキュメントを検索します。 検索する座標を指定する場合は、最初に 経度 、次に 緯度 を指定する必要があります。 経度の値は、両端を含む-180から180までです。 緯度の値は、両端を含む-90から90までです。

注意

Atlas Search は以下の機能をサポートしていません。

  • 非デフォルトの座標参照システム(CRS)

  • 平面 XY 座標系 (2 次元)

  • 座標ペアのポイント表記(pointFieldName: [12, 34])

guitarsコレクション内の一部のドキュメントにはin_stock_locationフィールドが追加されています。 コレクション内の変更されたドキュメントは、次のようになります。

{ "_id": 1, "make": "Fender", "description": "...", "establishedYear": 1946, "in_stock": true, "in_stock_location": { "type": "Point", "coordinates": [ -73.93615, 40.69791 ]}, "rating": 9 }
{ "_id": 2, "make": "Gibson", "description": "...", "establishedYear": 1902, "in_stock": true, "in_stock_location": { "type": "Point", "coordinates": [ 47.6062, 122.321 ]}, "rating": 8 }

次の例では、 in_stock_locationフィールドの座標が指定された多角形と交差しているすべてのドキュメントを検索します。

GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[]
{
new(-72.93615, 41.69791),
new(-72.93615, 40.59791),
new(-74.93615, 40.59791),
new(-74.93615, 41.69791),
new(-72.93615, 41.69791),
})));
var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.GeoShape(g => g.InStockLocation, GeoShapeRelation.Intersects, searchArea))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in_stock" : true, "in_stock_location" : { "type" : "Point", "coordinates" : ["-73.93615", "40.69791"] }, "rating" : 9 }

geoShape演算子の詳細については、 geoShape Atlas ガイドを参照してください。

GeoWithin()メソッドを使用して、指定されたGeoJSONフィールドの座標が特定のジオメトリ内にあるドキュメントを検索します。 内にあるポイントを検索できます。

  • 境界ボックス

  • 多角形

検索する座標を指定する場合は、最初に 経度 、次に 緯度 を指定する必要があります。 経度の値は、両端を含む-180から180までです。 緯度の値は、両端を含む-90から90までです。

注意

Atlas Search は以下の機能をサポートしていません。

  • 非デフォルトの座標参照システム(CRS)

  • 平面 XY 座標系 (2 次元)

  • 座標ペアのポイント表記(pointFieldName: [12, 34])

guitarsコレクション内の一部のドキュメントにはin_stock_locationフィールドが追加されています。 コレクション内の変更されたドキュメントは、次のようになります。

{ "_id": 1, "make": "Fender", "description": "...", "establishedYear": 1946, "in_stock": true, "in_stock_location": { "type": "Point", "coordinates": [ -73.93615, 40.69791 ]}, "rating": 9 }
{ "_id": 2, "make": "Gibson", "description": "...", "establishedYear": 1902, "in_stock": true, "in_stock_location": { "type": "Point", "coordinates": [ 47.6062, 122.321 ]}, "rating": 8 }

次の例では、 in_stock_locationフィールドの座標が指定された多角形内にあるすべてのドキュメントを検索します。

GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[]
{
new(-74.3994140625, 40.5305017757),
new(-74.7290039063, 40.5805846641),
new(-74.7729492188, 40.9467136651),
new(-74.0698242188, 41.1290213475),
new(-73.65234375, 40.9964840144),
new(-72.6416015625, 40.9467136651),
new(-72.3559570313, 40.7971774152),
new(-74.3994140625, 40.5305017757),
})));
var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.GeoWithin(g => g.InStockLocation, searchArea))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "in_stock_location" : { "type" : "Point", "coordinates" : ["-73.93615", "40.69791"] }, "rating" : 9 }

geoWithin演算子の詳細については、 geoWithin Atlas ガイド を参照してください。

指定値のリストと一致するフィールド値を持つドキュメントを検索するには、In() メソッドを使用します。

次の例では、 guitarsコレクションで、makeフィールドの値が "Fender" または "Gibson" のいずれかであるドキュメントを検索します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.In(g => g.Make, ["Fender", "Gibson"]))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id": 1, "make": "Fender", "description": "...", "establishedYear": 1946, "in_stock": true, "rating": 9 }
{ "_id": 2, "make": "Gibson", "description": "...", "establishedYear": 1902, "in_stock": true, "rating": 8 }

入力ドキュメントに類似するドキュメントを検索するには、 MoreLikeThis()メソッドを使用します。

次の例では、 guitarsコレクションで、 Descriptionフィールドの値が「高品質」であるオブジェクトに類似しているドキュメントを検索します。

var searchDocument = new GuitarSearch()
{
Description = "high quality",
};
var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.MoreLikeThis(searchDocument))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 3, "make" : "PRS", "description" : "High-end guitars known for their quality.", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 }
{ "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in_stock" : false, "rating" : null }

moreLikeThis演算子の詳細については、Atlas ガイドのmoreLikeThis Atlas ガイドを参照してください。

Near()メソッドを使用して、指定したフィールドが指定の値に近いドキュメントを検索します。 検索は、次に対して実行できます。

  • 数値フィールド

  • 日付フィールド

  • 地理的ポイント

次の例では、 guitarsコレクションで、 ratingフィールドの値が9に近いドキュメントを検索します。 値が数値9にどのように近いかに基づいて、ドキュメントは順番に返されます。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Near(g => g.Rating, 9, 1))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 }
{ "_id" : 3, "make" : "PRS", "description" : "...", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 }
{ "_id" : 2, "make" : "Gibson", "description" : "...", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }
{ "_id" : 5, "make" : "Ibanez", "description" : "...", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }

near演算子の詳細については、近くのAtlas ガイドを参照してください。

指定したフィールドに入力stringが含まれているドキュメントを検索するには、Phrase() メソッドを使用します。

次の例では、 guitarsコレクションで、 descriptionフィールドに「ClassicReads」というフレーズが含まれているドキュメントを検索します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Phrase(g => g.Description, "classic guitars"))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 }
{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }

次のように、 コレクションで複数の個別のフレーズに一致するドキュメントを検索することもできます。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Phrase(g => g.Description, new List<string>() { "classic guitars", "quality guitars" }))
.ToList();

この検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 }
{ "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in_stock" : false, "rating" : null }
{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }

phrase演算子について詳しくは、Atlas ガイドのフレーズを参照してください。

QueryString()メソッドを使用して、次の演算子と区切り文字を含む string を使用してドキュメントを検索します。

  • AND

  • OR

  • NOT

  • ()

次の例では、 guitarsコレクションで、 descriptionフィールドの値が次の各条件に一致するドキュメントを検索します。

  • string "Classic"またはstring "quality" が含まれます

  • "custom" という string を含まない

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.QueryString(g => g.Description, "(classic OR quality) AND NOT custom"))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 }
{ "_id" : 3, "make" : "PRS", "description" : "High-end guitars known for their quality.", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 }
{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }

queryString演算子の詳細については、 Atlas ガイドのqueryStringを参照してください。

Range() メソッドを使用して、指定フィールドの値が特定の数値、日付、または文字列の範囲内にあるドキュメントを検索します。

次の例では、 guitarsコレクションで、 establishedYearの値が 1980 より大きく 2020 より小さいすべてのドキュメントを検索します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search
.Range(g => g.EstablishedYear, SearchRangeBuilder.Gt(1980).Lt(2020)))
.ToList();

この検索では、次の結果が返されます。

{ "_id" : 3, "make" : "PRS", "description" : "High-end guitars known for their quality.", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 }
{ "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in_stock" : false, "rating" : null }
{ "_id" : 6, "make" : "Strandberg", "description" : "Modern guitars known for their headless models.", "establishedYear" : 1982, "in_stock" : false, "rating" : null }

指定したフィールドの値が文字列の範囲内にあるドキュメントを検索するには、まずフィールドにトークンインデックスを作成する必要があります。インデックスを作成した後、次の例に示すように、文字列の範囲に基づいてドキュメントを検索できます。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search
.Range(g => g.Make, SearchRangeV2Builder.Gte("Fender").Lte("Kiesel")))
.ToList();

上記の例では、makeフィールドの string 値が "Fender" 以上で、かつ "Kiesel" 以下であるドキュメントを検索します。ドライバーは、string の値を辞書順に比較します。

この検索では、次の結果が返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 }
{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }
{ "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in_stock" : false, "rating" : null }
{ "_id" : 5, "make" : "Ibanez", "description" : "Well-crafted guitars used by many professional guitarists.", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }

range演算子の詳細については、 Atlas の範囲ガイド を参照してください。

正規表現を使用してドキュメントを検索するには、 Regex()メソッドを使用します。

次の例では、 guitarsコレクションで、 makeフィールドの値に 6 文字だけが含まれているドキュメントを検索します。

var regex = "[A-Za-z]{6}";
var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Regex(g => g.Make, regex))
.ToList();

この検索では、次の結果が返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 }
{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }
{ "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in_stock" : false, "rating" : null }
{ "_id" : 5, "make" : "Ibanez", "description" : "Well-crafted guitars used by many professional guitarists.", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }

注意

デフォルトでは、 regex演算子は分析対象フィールドでは実行できません。 次のように、 allowAnalyzedFieldオプションを true に設定することで、分析フィールドで実行できるようになります。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Regex(g => g.Make, regex, true))
.ToList();

allowAnalyzedFieldオプションを true に設定すると、予期しない検索結果が発生する可能性があります。 詳しくは、「正規表現の動作 」を参照してください。

regex演算子の詳細については、 Atlas ガイドの正規表現を参照してください。

フィールドのリージョン内に一致するテキスト検索を検索するには、 Span()メソッドを使用します。 このメソッドを使用すると、指定した精度で相互に近い文字列を検索できます。

注意

span演算子は、クエリが位置情報を追跡する必要があるため、他の演算子よりも計算負荷が高くなります。

次の例では、 guitarsコレクションで、 descriptionフィールドの値に 1 単語以内の string が含まれているドキュメントを検索します。

var searchTerms = new[]
{
Builders<Guitar>.SearchSpan.Term(g => g.Description, "guitars"),
Builders<Guitar>.SearchSpan.Term(g => g.Description, "quality")
};
var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Span(Builders<Guitar>.SearchSpan.Near(searchTerms, 1)))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in_stock" : false, "rating" : null }

_id: 3を含むドキュメントには「groups」と「quality」という文字列が含まれていますが、これらは複数の単語で区切られているため、検索ではこのドキュメントが結果から除外されます。

span演算子の詳細については、 Atlas ガイドの範囲を参照してください。

ドキュメント内で指定された string または string の配列を検索するには、 Text()メソッドを使用します。 特定の string に複数の検索タームがある場合、Atlas Search は string 内の各タームの一致も個別に検索します

次の例では、 guitarsコレクションで、 descriptionフィールドの値に「プロが使用する」という string が含まれているドキュメントを検索します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Text(g => g.Description, "used by professional"))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 5, "make" : "Ibanez", "description" : "Well-crafted guitars used by many professional guitarists.", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }

Tip

検索 string に複数のタームが含まれている場合、このメソッドは string 内の各タームの一致も個別に検索します

text演算子の詳細については、Atlas ガイドのテキストを参照してください。

Wildcard() メソッドを使用して、検索stringに任意の文字に一致する特殊文字を使用してドキュメントを検索します。 検索では、次の文字を使用できます。

文字
説明

?

任意の 1 文字と一致

*

0 文字以上の文字と一致

\

エスケープ文字

次の例では、 makeフィールドの値に string「Strand」とそれに続く他の文字が含まれているドキュメントを検索します。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Wildcard(g => g.Make, "Strand*"))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 6, "make" : "Strandberg", "description" : "Modern guitars known for their headless models.", "establishedYear" : 1982, "in_stock" : false, "rating" : null }

注意

デフォルトでは、 wildcard演算子は分析対象フィールドでは実行できません。 次のように、 allowAnalyzedFieldオプションを true に設定することで、分析フィールドで実行できるようになります。

var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Wildcard(g => g.Make, "Strand*", true))
.ToList();

allowAnalyzedFieldオプションを true に設定すると、予期しない検索結果が発生する可能性があります。 詳しくは、「ワイルドカードの動作 」を参照してください。

wildcard演算子の詳細については、ワイルドカードAtlas のガイドを参照してください。

pathパラメータは Atlas Search演算子によって使用され、検索するフィールドまたはフィールド群を指定します。pathパラメーターに含まれる可能性のある内容について詳しくは、クエリ パスを構築するガイドをご覧ください。

注意

すべての演算子がすべての異なるタイプのパスを使用できるわけではありません。 サポートされるパスのタイプの詳細については、各演算子のドキュメントを参照してください。

複数のインデックス付きフィールドを検索するには、Multi() メソッドを使用し、フィールドを渡してください。指定されたフィールドのいずれかに一致するドキュメントが結果セットに含まれます。

次の例では、makeまたはdescriptionフィールドのいずれかで次の例では、make または description フィールドのいずれかで文字列classicを検索します。

var result = guitarsCollection.Aggregate().Search(
Builders<Guitar>.Search.Phrase(Builders<Guitar>.SearchPath
.Multi(g => g.Description, g => g.Make), "classic"), indexName: "guitarmulti")
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9}
{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8}

Atlas 検索クエリによって返されるすべてのドキュメントには関連性に基づいてスコアが割り当てられ、結果セットに含まれるドキュメントは最高スコアから最低スコアの順に返されます。スコアの割り当て方法について詳しくは、スコア Atlasガイドをご覧ください。

返されたドキュメントに割り当てられるスコアは、ドキュメントのメタデータの一部です。集計パイプラインで $project ステージを使用すると、返された各ドキュメントのスコアを結果セットに含めることができます。

次の例では、guitarsコレクションで、makeフィールドの値に 6 文字だけが含まれているドキュメントを検索し、$project ステージを使用して返されるドキュメントに score という名前のフィールドを追加します。

var regex = "[A-Za-z]{6}";
var result = guitarsCollection.Aggregate()
.Search(Builders<Guitar>.Search.Regex(g => g.Make, regex, allowAnalyzedField: true), indexName: "guitarscore")
.Project<Guitar>(Builders<Guitar>.Projection
.Include("Id")
.Include("Make")
.Include("Description")
.MetaSearchScore(g => g.Score))
.ToList();

検索では、次のドキュメントが返されます。

{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 0, "in_stock" : false, "rating" : null, "score" : 1.0 }
{ "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 0, "in_stock" : false, "rating" : null, "score" : 1.0 }
{ "_id" : 5, "make" : "Ibanez", "description" : "Well-crafted guitars used by many professional guitarists.", "establishedYear" : 0, "in_stock" : false, "rating" : null, "score" : 1.0 }
{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 0, "in_stock" : false, "rating" : null, "score" : 1.0 }

SearchOptionsオブジェクトをパラメーターとして渡すことで、Search() メソッドの動作を変更できます。

SearchOptionsクラスには、次のプロパティが含まれています。

プロパティ
説明

CountOptions

The options for counting the search results.
Default: null

Highlight

The options for displaying search terms in their original context.
Default: null

IndexName

The index to use for the search.
Data type: string
Default: null

ReturnStoredSource

A flag that specifies whether to perform a full document lookup on the database or to return only stored source fields directly from Atlas Search.
Data type: boolean
Default: false

ScoreDetails

A flag that specifies whether to return detailed information about the score for each document in the results.
Data type: boolean
Default: false

SearchAfter

The starting point for pagination. When set, the search retrieves documents starting immediately after the specified reference point.
Data type: string
Default: null

SearchBefore

The end point for pagination. When set, the search retrieves documents starting immediately before the specified reference point.
Data type: string
Default: null

Sort

The sorting criteria to apply to the results.
Default: null

Tracking

The options for tracking search terms.
Default: null

次の例では、次のアクションを実行して Atlas Search操作の結果をページ分割します。

  • MetaSearchSequenceToken() ビルダ メソッドを使用するプロジェクションを定義します。このメソッドでは、基準点を含む PaginationToken を指定します

  • SearchOptionsインデックスとソート条件を設定する SearchOptions インスタンスを作成します。

  • 初期検索を実行して、description フィールド値に "classic" というテキストを含むドキュメントを見つけ、プロジェクションとオプションを操作に適用します。

  • 同じ SearchOptions インスタンスの SearchAfter プロパティを設定し、基本検索の最初の結果の後に次の検索を開始するように指示します。

  • 同じ一致条件を持つ別の検索操作を実行し、検索オプションを適用して結果をページネーションします

var projection = Builders<Guitar>.Projection
.Include(x => x.Make)
.MetaSearchSequenceToken(x => x.PaginationToken);
var searchDefinition = Builders<Guitar>.Search.Text(g => g.Description, "classic");
var searchOptions = new SearchOptions<Guitar>
{ IndexName = "default", Sort = Builders<Guitar>.Sort.Ascending(g => g.Id) }
// Runs the base search operation
var baseSearchResults = guitarsCollection.Aggregate()
.Search(searchDefinition, searchOptions)
.Project<Guitar>(projection)
.ToList();
// Sets the starting point for the next search
searchOptions.SearchAfter = baseSearchResults[0].PaginationToken;
var result = guitarsCollection.Aggregate()
.Search(searchDefinition, searchOptions)
.Project<Guitar>(projection)
.ToList();

検索では、次のドキュメントが返されます。

{ "_id": 2, "make": "Gibson", "description": "Classic guitars known for their rich, full tones.", "establishedYear": 1902, "in_stock": true, "rating": 8 }

Tip

Atlas Search のページ分割の詳細については、Atlas ドキュメントの「結果のページ分割」を参照してください。

戻る

データベースコマンドの実行

項目一覧