MongoDB は、ドキュメント内の string コンテンツに対してテキスト クエリを実行するクエリ操作をサポートしています。テキストクエリを実行するために、 MongoDB はテキストインデックスと $textクエリ演算子を使用します。
全文検索やベクトル検索などの他のテキスト検索オプションの詳細については、 MongoDB Serverマニュアルの テキスト検索の概要 を参照してください。
ドライバーはテキスト クエリ フィルターの作成を容易にするための Filters.text()ヘルパーメソッドを提供します。
前提条件
このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。
test.restaurantsドキュメントrestaurants.jsonアセットGithubの ファイルのドキュメントが入力された コレクション。次のインポート ステートメントは次のとおりです。
import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Indexes; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Sorts; import com.mongodb.client.model.TextSearchOptions; import com.mongodb.client.model.Projections; import org.bson.Document;
重要
このガイドでは、カスタムSubscriber実装を使用します。これについては、 カスタム サブスクリプション実装ガイドで説明されています。
MongoDB 配置への接続
まず、MongoDB 配置に接続し、 インスタンスと インスタンスをMongoDatabase MongoCollection宣言して定義します。
次のコードは、ポート27017のlocalhostで実行されているスタンドアロンの MongoDB 配置に接続します。 次に、 testデータベースを参照するためのdatabase変数と、 restaurantsコレクションを参照するためのcollection変数を定義します。
MongoClient mongoClient = MongoClients.create(); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("restaurants");
MongoDB 配置への接続の詳細については、「 MongoDB への接続」チュートリアルを参照してください。
テキストインデックスの作成
テキスト インデックスを作成するには、 Indexes.text()静的ヘルパーを使用してテキスト インデックスの仕様を作成し、その仕様をMongoCollection.createIndex()メソッドに渡してインデックスを作成します。
次の例では、 restaurantsコレクションのnameフィールドにテキスト インデックスを作成しています。
MongoCollection<Document> collection = database.getCollection("restaurants"); collection.createIndex(Indexes.text("name")).subscribe(new PrintToStringSubscriber<String>());
テキストクエリの実行
テキストクエリを実行するには、Filters.text()ヘルパーメソッドを使用して テキストクエリフィルターを指定します。
例、次のコードは nameフィールドに対してテキスト クエリを実行し、"bakery" または "coffee" の文字列と一致させます。
collection .countDocuments(Filters.text("bakery coffee")) .subscribe(new PrintSubscriber<Long>("Text query matches: %s"));
Text query matches: [2]
テキストスコア
テキストクエリは、一致するドキュメントごとに、指定された テキストクエリフィルターへのドキュメントの関連性を表すスコアを割り当てます。スコアを返して並べ替えるには、プロジェクションドキュメントで $meta 演算子とソート式を使用します。
collection.find(Filters.text("bakery cafe")) .projection(Projections.metaTextScore("score")) .sort(Sorts.metaTextScore("score")) .subscribe(new PrintDocumentSubscriber());
テキストクエリ オプションの指定
Filters.text()ヘルパーはさまざまなテキストクエリ オプションを受け入れることができます。ドライバーは、これらのオプションを指定するための TextSearchOptionsクラスを提供します。
例、次のテキストクエリでは、"cafe" という単語に対してテキストクエリを実行するときに、 テキストクエリ言語オプションを指定します。
collection.countDocuments( Filters.text("cafe", new TextSearchOptions().language("english")) ).subscribe(new PrintSubscriber<Long>("Text query matches (English): %s"));
Text query matches (English): [1]
テキストクエリの詳細については、 MongoDB Serverマニュアルの次のセクションを参照してください。