検索テキスト
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 配列フィールドを指定します。
次の例では、 fast_and_furious_movies
コレクションのtitle
フィールドでテキスト検索を実行します。 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_and_furious_movies
コレクション内のドキュメントで、「fast」というタームを含むタイトルをテキスト検索します。
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()
メソッドに渡すと、タームのいずれかに一致するドキュメントが返されます。
例
次の例では、 fast_and_furious_movies
コレクション内のドキュメントで、「fate」または「7」というタームを含むタイトルをテキスト検索します。
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()
メソッドに渡して、テキスト検索でフレーズを指定します。 エスケープされた引用符は、バックスラッシュ文字が前に付いたdouble引用符文字です。 フレーズの前後にエスケープされた引用符を付けない場合、 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 つのテキスト検索タームが必要です。
例
次の例では、 fast_and_furious_movies
コレクション内のドキュメントで、「fourial」というタームを含むが「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"] }