テキスト検索
MongoDB は、ドキュメント内の string コンテンツに対してテキスト検索を実行するクエリ操作をサポートしています。 テキスト検索を実行するために、MongoDB は テキストインデックス と $text
クエリ演算子を使用します。 テキスト検索の詳細については、サーバー マニュアルのテキスト検索を参照してください。
ドライバーはテキスト検索クエリフィルターの作成を容易にするための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
フィールドでテキスト検索を実行し、string "bakery"
または"coffee"
と一致させます。
collection .countDocuments(Filters.text("bakery coffee")) .subscribe(new PrintSubscriber<Long>("Text search matches: %s"));
Text search 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 search matches (english): %s"));
Text search matches (english): [1]
テキスト検索の詳細については、 MongoDB Serverマニュアルの次のセクションを参照してください。