Overview
このガイドでは、 MongoDB Javaドライバーでテキスト クエリを実行する方法を学習できます。
テキストクエリを使用して、指定されたフィールドにタームまたはフレーズを含むドキュメントを検索できます。タームは、空白文字を除外する文字のシーケンスです。フレーズは、任意の数の空白文字を含むタームのシーケンスです。
次のセクションでは、次のタイプのテキストクエリを実行する方法を説明します。
タームによるクエリ テキスト
フレーズで検索テキストを取得
タームが除外されたクエリ テキスト
テキスト クエリの結果を並べ替える場合は、 結果の並べ替えガイドの テキスト クエリのセクションを参照してください。
サンプル ドキュメント
次のセクションでは、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"] }
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
を含めることができます。デフォルトでは 、テキストクエリは大文字と小文字を区別せずに実行されます。つまり、検索は小文字と大文字の値に一致します。
大文字と小文字を区別した検索を指定するには、次のスニペットを使用します。
TextSearchOptions options = new TextSearchOptions().caseSensitive(true); Bson filter = Filters.text("SomeText", options);
このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。
タームでテキストを検索
タームを string として Filters.text()
メソッドに渡し、テキスト クエリでタームを指定します。
例
次の例では、「fast」タームを含むタイトルの fast_and_furious_movies
コレクション内のドキュメントに対してテキスト クエリを実行します。
Bson filter = Filters.text("fast"); collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));
次に、前のコードの出力を示します。
{ "_id": 1, "title": "2 Fast 2 Furious ", "tags": ["undercover", "drug dealer"] } { "_id": 2, "title": "Fast 5", "tags": ["bank robbery", "full team"] }
テキスト クエリで複数のタームを検索するには、Filters.text()
ビルダー メソッドで各タームをスペースで区切ります。ビルダ メソッドはテキストクエリを Bson
インスタンスとして返します。これを find()
メソッドに渡すと、タームのいずれかに一致するドキュメントが返されます。
例
次の例では、"fate" または "7" というタームを含むタイトルの fast_and_furious_movies
コレクション内のドキュメントに対してテキスト クエリを実行します。
Bson filter = Filters.text("fate 7"); collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));
次に、前のコードの出力を示します。
{ "_id": 3, "title": "Furious 7", "tags": ["emotional"] } { "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }
フレーズでテキストを検索
Filters.text()
エスケープされた引用符を含むフレーズを メソッドに渡して、テキスト クエリでフレーズを指定します。エスケープされた引用符は、バックスラッシュ文字が前に付いた二重引用符文字です。フレーズの前後にエスケープされた引用符を付けない場合、find()
メソッドはターム検索を実行します。
例
次の例では、「フェイルオーバー」というフレーズを含むタイトルの fast_and_furious_movies
コレクション内のドキュメントに対してテキスト クエリを実行します。
Bson filter = Filters.text("\"fate of the furious\""); collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));
次に、前のコードの出力を示します。
{ "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }
タームを除外した検索テキスト
テキスト クエリから除外する各タームについて、Filters.text()
ビルダー メソッドに渡す string のタームの前にマイナス記号を付けます。
検索から返されるドキュメントには、テキスト インデックス フィールドに除外されたタームが含まれていません。
重要
検索からタームを除外するには、少なくとも 1 つのテキストクエリタームが必要です。
例
次の例では、「fourial」タームが含まれるタイトルの fast_and_furious_movies
コレクション内のドキュメントに対してテキスト クエリを実行しますが、「fast」タームは 含まれていません 。
Bson filter = Filters.text("furious -fast"); collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));
次に、前のコードの出力を示します。
{ "_id": 3, "title": "Furious 7", "tags": ["emotional"] } { "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }