Overview
このガイドでは、 MongoDB Kotlinドライバーでテキスト クエリを実行する方法を学習できます。
テキストクエリを使用して、指定されたフィールドにタームまたはフレーズを含むドキュメントを取得できます。タームは、空白文字を除外する文字のシーケンスです。フレーズは、任意の数の空白文字を含むタームのシーケンスです。
次のセクションでは、次のタイプのテキストクエリを実行する方法を説明します。
タームによるクエリ テキスト
フレーズで検索テキストを取得
タームが除外されたクエリ テキスト
テキスト クエリの結果を並べ替える場合は、 結果の並べ替えガイドの テキスト クエリのセクションを参照してください。
サンプル ドキュメント
次のセクションでは、fast_and_furious_moviesコレクションのテキスト クエリの例を紹介します。各セクションでは、collection という名前の変数を使用して、fast_and_furious_moviesコレクションの MongoCollectionインスタンスを参照します。
fast_and_furious_moviesコレクションには、映画「F形式」の構成要素であるいくつかの映画の 1 つを説明するドキュメントが含まれています。 各ドキュメントには、タイトル フィールドとタグ フィールドが含まれています。
{ "_id": 1, "title": "2 Fast 2 Furious ", "tags": ["undercover", "drug dealer"] } { "_id": 2, "title": "Fast 5", "tags": ["bank robbery", "full team"] } { "_id": 3, "title": "Furious 7", "tags": ["emotional"] } { "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }
このデータは、次の Kotlin データ クラスでモデル化されます。
data class Movies( val id: Int, val title: String, val tags: List<String> )
Text Index
テキストクエリを実行中前に、テキストインデックスを作成する必要があります。テキストインデックスは、テキストクエリを実行する string または string 配列フィールドを指定します。
次の例では、title fast_and_furious_moviesコレクションの フィールドに対してテキスト クエリを実行します。 フィールドでテキストクエリを有効にするには、次のスニペットを含むtitle インデックス ビルダ を使用してテキストインデックスを作成します。
collection.createIndex(Indexes.text("title"))
詳細については、次のリソースを参照してください。
インデックス ガイドの「テキスト インデックス」セクション
テキストインデックスのサーバー マニュアル エントリ
テキストクエリ
テキストクエリを指定するには、Filters.text() メソッドを使用します。
メソッドはFilters.text() フィルター ビルダを使用して、テキスト クエリ中に検索する内容を指定するクエリフィルターを定義します。クエリフィルターはBSONインスタンスによって表されます。クエリフィルターを find()メソッドに渡して、テキスト クエリを実行します。
find()メソッドを実行すると、 MongoDB はコレクションのテキストインデックスでインデックス付けされたすべてのフィールドに対してテキストクエリを実行します。 MongoDB は、1 つ以上のクエリタームと各結果の関連性スコアを含むドキュメントを返します。関連性スコアの詳細については、 結果のソートガイドの テキスト クエリ セクションを参照してください。
オプションの指定
大文字と小文字の区別などのテキストクエリ オプションを指定するには、Filters.text() メソッドの 2 番目のパラメータとして TextSearchOptions を含めることができます。デフォルトでは 、テキストクエリは大文字と小文字を区別せずに実行されます。つまり、クエリは小文字と大文字の値を一致させます。
大文字と小文字を区別するクエリを指定するには、次のスニペットを使用します。
val options: TextSearchOptions = TextSearchOptions().caseSensitive(true) val filter = Filters.text("SomeText", options)
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
タームによるクエリ テキスト
タームを string として Filters.text() メソッドに渡し、テキスト クエリでタームを指定します。
例
次の例では、「fast」タームを含むタイトルの fast_and_furious_moviesコレクション内のドキュメントに対してテキスト クエリを実行します。
val filter = Filters.text("fast") val findFlow = collection.find(filter) findFlow.collect { println(it) }
Movies(id=1, title=2 Fast 2 Furious, tags=[undercover, drug dealer]) Movies(id=2, title=Fast 5, tags=[bank robbery, full team])
テキスト クエリで複数のタームを検索するには、Filters.text() ビルダー メソッドで各タームをスペースで区切ります。ビルダ メソッドはテキストクエリを Bsonインスタンスとして返します。これを find() メソッドに渡すと、タームのいずれかに一致するドキュメントが返されます。
例
次の例では、"fate" または "7" というタームを含むタイトルの fast_and_furious_moviesコレクション内のドキュメントに対してテキスト クエリを実行します。
val filter = Filters.text("fate 7") val findFlow = collection.find(filter) findFlow.collect { println(it) }
Movies(id=3, title=Furious 7, tags=[emotional]) Movies(id=4, title=The Fate of the Furious, tags=[betrayal])
フレーズで検索テキストを取得
エスケープされた引用符を含むフレーズを Filters.text()メソッドに渡して、テキスト クエリでフレーズを指定します。エスケープされた引用符は、バックスラッシュ文字が前に付いた二重引用符文字です。 フレーズの前後にエスケープされた引用符を付けない場合、find() メソッドはターム検索を実行します。
例
次の例では、「フェイルオーバー」というフレーズを含むタイトルの fast_and_furious_moviesコレクション内のドキュメントに対してテキスト クエリを実行します。
val filter = Filters.text("\"fate of the furious\"") val findFlow = collection.find(filter) findFlow.collect { println(it) }
Movies(id=4, title=The Fate of the Furious, tags=[betrayal])
タームが除外されたクエリ テキスト
テキスト クエリから除外する各タームについて、Filters.text() ビルダー メソッドに渡す string のタームの前にマイナス記号を付けます。
クエリから返されるドキュメントには、テキストインデックスフィールドに除外されたタームが含まれていません。
重要
クエリからタームを除外する場合は、少なくとも 1 つのテキストタームが必要です。
例
次の例では、「fourial」タームが含まれるタイトルの fast_and_furious_moviesコレクション内のドキュメントに対してテキスト クエリを実行しますが、「fast」タームは 含まれていません 。
val filter = Filters.text("furious -fast") val findFlow = collection.find(filter) findFlow.collect { println(it) }
Movies(id=3, title=Furious 7, tags=[emotional]) Movies(id=4, title=The Fate of the Furious, tags=[betrayal])