Overview
このガイドでは、 Scalaドライバーを使用してコレクションに対してMongoDB Search クエリを実行する方法を学習できます。 MongoDB Search を使用すると、コレクションに対して全文検索を実行できます。 MongoDB Search インデックスは、検索の動作とインデックスを作成するフィールド を指定します。
Scalaドライバーを使用してMongoDB Search インデックスを作成および管理する方法については、「 MongoDB Search とMongoDB ベクトル検索インデックスのガイド 」を参照してください。
サンプル データ
このガイドの例では、Atlasサンプルデータセットのsample_mflixデータベースにあるmoviesコレクションを使用します。MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、Atlas を使い始める を参照してください。
MongoDB 検索クエリを実行する
注意
MongoDB Search は、次の配置で利用できます。
MongoDB Atlas v4.2 以降
MongoDB Community Edition v8.2 以降
MongoDB Search クエリを実行するには、コレクションにMongoDB Searchインデックスが 必要です 。 MongoDB Searchインデックスの作成方法については、「 MongoDB Search とMongoDB ベクトル検索インデックスのガイド 」を参照してください。
全文検索を実行するには、$searchパイプラインステージで aggregate() メソッドを呼び出します。 Scalaドライバーは、このステージを作成するための Aggregates.search()ヘルパーメソッドを提供します。 search() メソッドには次の引数が必要です。
SearchOperator検索するフィールドとテキストを指定するインスタンスSearchOptionsインスタンス。使用するMongoDB Searchインデックスの名前など、検索をカスタマイズするためのオプションを指定します
次の例では、 titleフィールドでテキスト "Alabama" を検索し、デフォルトで含まれる _idフィールドと、一致するドキュメントの titleフィールドのみをプロジェクションします。
val operator = SearchOperator.text( SearchPath.fieldPath("title"), "Alabama") val options = searchOptions().index("<search index name>") val pipeline = Seq( Aggregates.search(operator, options), Aggregates.project(Projections.include("title")) ) try { Await .result(collection.aggregate(pipeline).toFuture(), 20.seconds) .foreach((doc: Document) => println(doc.toJson())) } catch { case e: Throwable => println(s"There was an error: $e") }
{"_id": {"$oid": "..."}, "title": "Alabama Moon"} {"_id": {"$oid": "..."}, "title": "Crazy in Alabama"} {"_id": {"$oid": "..."}, "title": "Sweet Home Alabama"}
Tip
Atlas ドキュメントのMongoDB Search チュートリアルを表示するには、「 Atlas Search クエリの実行 」を参照してください。
MongoDB 検索する メタデータ
注意
MongoDB Searchメタデータは、次の配置で利用できます。
MongoDB Atlas v4.4.11 以降
MongoDB Community Edition v8.2 以降
MongoDB Search クエリからメタデータのみを検索結果を返さずに検索するには、Aggregates.searchMeta()ヘルパーメソッドを使用します。次の例では、yearフィールドで 2010 の近くの値を検索するクエリのメタデータを返します。
try { Await .result( collection.aggregate(Seq( Aggregates.searchMeta( SearchOperator.near(2010, 1, SearchPath.fieldPath("year"))) )).toFuture(), 20.seconds ) .foreach((doc: Document) => println(doc.toJson())) } catch { case e: Throwable => println(s"There was an error: $e") }
{"count": {"lowerBound": 35}}
検索演算子を使用する
Scalaドライバーは次の演算子のヘルパーメソッドを提供します。
演算子 | 説明 |
|---|---|
不完全な入力 string からの文字シーケンスを含む単語またはフレーズを検索します。 | |
2 つ以上の演算子を 1 つのクエリに結合します。 | |
フィールドが指定した値と一致するかどうかを確認します。 | |
指定されたインデックス付きフィールド名へのパスがドキュメント内に存在するかどうかをテストします。 | |
指定されたパスにあるBSON番号、日付、ブール値、ObjectId、uuid、または string 値の配列を検索し、フィールドの値が指定された配列内の任意の値と等しいドキュメントを返します。 | |
入力ドキュメントに類似するドキュメントを返します。 | |
数値、日付、 GeoJSONポイント値のクエリとスコアリングをサポートします。 | |
インデックス構成で指定されたアナライザを使用して、順序付けられたタームのシーケンスを含むドキュメントを検索します。 | |
インデックス付きフィールドと値の組み合わせのクエリをサポートします。 | |
数値、日付、string 値のクエリとスコアリングをサポートします。 | |
クエリフィールドを 正規式として解釈します。 | |
インデックス構成で指定したアナライザを使用して全文検索を実行します。 | |
検索stringに任意の文字と一致する特殊文字を使用するクエリを有効にします。 |
パイプライン検索ステージの例
この例を実行する前に、moviesコレクションに次の定義を持つMongoDB検索インデックスを作成する必要があります。
{ "mappings": { "dynamic": true, "fields": { "title": { "analyzer": "lucene.keyword", "type": "string" }, "genres": { "normalizer": "lowercase", "type": "token" } } } }
MongoDB Search インデックスの作成の詳細については、「 MongoDB Search およびMongoDB ベクトル検索インデックスのガイド 」を参照してください。
次のコードでは、次の仕様を持つ $search ステージが作成されます。
genres配列に"Comedy"が含まれていることを確認fullplotフィールドでフレーズ"new york"を検索します1950から2000までのyear値と一致します"Love"というタームで始まるtitle値を検索します
val searchStage = Aggregates.search( SearchOperator.compound() .must( Iterable( SearchOperator.in(fieldPath("genres"), List("Comedy")), SearchOperator.phrase(fieldPath("fullplot"), "new york"), SearchOperator.numberRange(fieldPath("year")).gtLt(1950, 2000), SearchOperator.wildcard("Love *", fieldPath("title")), ).asJava ) ) val projectStage = Aggregates.project( Projections.include("title", "year", "genres")) try { Await .result( collection.aggregate(Seq(searchStage, projectStage)).toFuture(), 20.seconds ) .foreach((doc: Document) => println(doc.toJson())) } catch { case e: Throwable => println(s"There was an error: $e") }
{"_id": ..., "genres": ["Comedy", "Romance"], "title": "Love at First Bite", "year": 1979} {"_id": ..., "genres": ["Comedy", "Drama"], "title": "Love Affair", "year": 1994}
MongoDB 検索するヘルパーメソッドの詳細については、ドライバー Core API ドキュメントの SearchOperator インターフェース参照を参照してください。
詳細情報
MongoDB Search の詳細については、Atlas ドキュメントの「 MongoDB Search の概要 」を参照してください。
API ドキュメント
このガイドで説明するメソッドとタイプの詳細については、次の API ドキュメントを参照してください。