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 Vector Search インデックス」ガイドを参照してください。
フルテキスト検索を実行するには、$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") }
Tip
Atlas ドキュメントで MongoDB Search のチュートリアルを表示するには、Atlas 検索クエリを実行するを参照してください。
MongoDB 検索する メタデータ
注意
MongoDB Search メタデータは、次の配置で利用できます。
MongoDB Atlas v4.4.11 以降
MongoDB Community Edition v8.2 以降
Aggregates.searchMeta() ヘルパー メソッドを使用して、検索結果を返さずに MongoDB Search クエリからメタデータのみを取得します。次の例では、2010 に近い値を year フィールドで検索するクエリのメタデータが返されます。
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") }
検索演算子を使用する
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") }
MongoDB 検索するヘルパーメソッドの詳細については、ドライバー Core API ドキュメントの SearchOperator インターフェース参照を参照してください。
詳細情報
MongoDB Search の詳細については、Atlas ドキュメントの「MongoDB Search 概要」を参照してください。
API ドキュメント
このガイドで説明するメソッドとタイプの詳細については、次の API ドキュメントを参照してください。