Overview
このガイドでは、Scala ドライバーを使用してドキュメントに対してテキスト クエリを実行する方法を学ぶことができます。
テキスト クエリを使用して、指定されたフィールド内の期間またはフレーズを含むドキュメントを検索できます。期間には空白でない文字のみが含まれます。フレーズには、任意の数の空白文字によって分離された期間が含まれます。
注意
テキスト クエリには、検索するコレクション フィールドに対する テキスト インデックス が必要です。インデックスの作成方法については、「インデックスを使用してクエリを最適化する」ガイドを参照してください。
サンプル データ
このガイドの例では、Atlas サンプルデータセットの sample_mflix データベースの movies コレクションを使用します。Scalaアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続する MongoClient を作成します。次に、database 変数と collection 変数に次の値を割り当てます。
val database: MongoDatabase = mongoClient.getDatabase("sample_mflix") val collection: MongoCollection[Document] = database.getCollection("movies")
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、MongoDBを使い始めるガイドを参照してください。
テキストインデックスの作成
テキストクエリを実行する前に、コレクションにテキストインデックスを作成する必要があります。テキストインデックスは、1 つ以上の string フィールドをテキスト検索用にインデックスするよう指定します。次の例では、movies コレクションのtitle フィールドにテキスト インデックスを作成しています。
val observable = collection.createIndex(Indexes.text("title")) Await.result(observable.toFuture(), Duration(10, TimeUnit.SECONDS))
期間によるクエリ テキスト
特定の期間を含むドキュメントを検索するには、期間を string として Filters クラスの text() メソッドに渡します。
次の例では、title フィールドに期間 "time" が含まれるドキュメントの数をカウントします。
val filterTerm = text("time") collection.countDocuments(filterTerm) .subscribe((count: Long) => println(count))
複数の期間を含むドキュメントを検出するには、検索 string で期間をスペースで区切ります。次の例では、title フィールドに期間 "time" または期間 "machine" を含むドキュメントの数をカウントします。
val filterMultiple = text("time machine") collection.countDocuments(filterMultiple) .subscribe((count: Long) => println(count))
フレーズでテキストをクエリする
フレーズを含むドキュメントを検索するには、検索文字列内でエスケープされた引用符(\")で囲みます。
次の例では、title フィールド内に "time machine" という語句を含むドキュメントの数をカウントします。
val filterPhrase = text("\"time machine\"") collection.countDocuments(filterPhrase) .subscribe((count: Long) => println(count))
除外されたタームを含むクエリ テキスト
特定の期間を含むドキュメントを除外するには、検索ストリングで期間の前にハイフン (-) を付けます。クエリには少なくとも 1 つの正の期間を含める必要があります。
次の例では、期間 "time" を含むが、期間 "machine" を含まないドキュメントの数をカウントします。
val filterExclude = text("time -machine") collection.countDocuments(filterExclude) .subscribe((count: Long) => println(count))
クエリ テキスト オプションの指定
TextSearchOptionsオブジェクトをFilters.text()の2番目のパラメーターとして渡すことで、テキスト クエリの動作をカスタマイズできます。次の表は、TextSearchOptionsインスタンスに連鎖できるメソッドについて説明しています。
方式 | 説明 |
|---|---|
| テキスト クエリが大文字と小文字を区別するかどうかを設定します。デフォルトは |
| テキストクエリが分音記号に対して変感であるかどうかを設定します。デフォルトは |
| テキストクエリの言語を設定します。デフォルトはテキストインデックスの |
次の例では、title フィールドで、大文字と小文字を区別して検索した場合に、期間 "Time" に一致するドキュメントの数がカウントされます。
val options = TextSearchOptions().caseSensitive(true) val filterOptions = text("Time", options) collection.countDocuments(filterOptions) .subscribe((count: Long) => println(count))
詳細情報
テキスト検索の詳細については、MongoDB Serverマニュアルの次のリソースを参照してください。
Scala ドライバーを使用したインデックスの作成方法の詳細については、「インデックスを使用したクエリの最適化」ガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。