Overview
このガイドでは、Javaドライバーを使用してコレクションに対してMongoDB 検索クエリを実行する方法を学ぶことができます。MongoDB Search を使用すると、MongoDB Atlasでホストされているコレクションに対して全文検索を実行できます。MongoDB Search 検索インデックスは、検索の動作とインデックスを作成するフィールドを指定します。
サンプル データ
このガイドの例では、Atlas のサンプルデータセットから、sample_mflixデータベースのmoviesコレクションを使用します。MongoDB配置を作成し、サンプルデータセットをロードする方法については、MongoDBの使用開始ガイドを参照してください。集計操作とビルダの詳細については、集計ガイドを参照してください。
MongoDB 検索クエリを実行する
このセクションでは、コレクションに対してMongoDB 検索クエリを実行するための集計パイプラインを作成する方法について説明します。Aggregates.search() ビルダ メソッドを使用して、検索条件を指定する $searchパイプラインステージを作成できます。次に、aggregate() メソッドを呼び出し、パイプラインをパラメーターとして渡します。
注意
Atlas および Community Edition のバージョン要件
$search 集計パイプライン演算子は、 MongoDB v4.2 以降を実行中MongoDB Atlasクラスター、またはMongoDB v8.2 以降を実行中MongoDB Community Editionクラスターでホストされているコレクションでのみ使用できます。コレクションはMongoDB 検索インデックスでカバーされている必要があります。必要な設定とこの演算子の機能の詳細については、MongoDB 検索するのドキュメントを参照してください。
MongoDB Search クエリを実行する前に、コレクションに MongoDB Search インデックスを作成する必要があります。MongoDB Search インデックスをプログラムで作成する方法については、インデックスガイドの「MongoDB Search および Vector Search インデックス」セクションを参照してください。
MongoDB 検索するの例
この例では、次のアクションを実行してMongoDB 検索クエリを実行します。
Aggregates.search()ビルダ メソッドを使用して$searchステージを構築し、ドライバーにtitleフィールドに"Alabama"という単語が含まれているドキュメントをクエリするよう指示します。Aggregates.project()ビルダ メソッドを使用して$projectステージを構築し、クエリ結果にtitleフィールドを含めるようにドライバーに指示しますパイプラインのステージを
aggregate()メソッドに渡し、結果を出力します。
collection.aggregate( Arrays.asList( Aggregates.search(SearchOperator.text( SearchPath.fieldPath("title"), "Alabama")), Aggregates.project(Projections.include("title")) ) ).forEach(doc -> System.out.println(doc.toJson()));
{"_id": {"$oid": "..."}, "title": "Alabama Moon"} {"_id": {"$oid": "..."}, "title": "Crazy in Alabama"} {"_id": {"$oid": "..."}, "title": "Sweet Home Alabama"}
Tip
Java ドライバー MongoDB Search の例
Java ドライバーを使用して MongoDB Search クエリを実行する例の詳細については、Atlas ドキュメントの「MongoDB Search チュートリアル」を参照してください。
MongoDB 検索する メタデータ
searchMeta() メソッドを使用して $searchMeta パイプラインステージを作成し、MongoDB Search 結果からメタデータのみを返します。
注意
Atlas および Community Edition のバージョン要件
この集計パイプライン演算子は、MongoDB Atlasクラスターでv4.4.11 以降を実行中、またはMongoDB Community EditionクラスターでMongoDB v8.2 以降を実行中のみ使用できます。利用可能なバージョンの詳細なリストについては、$searchMeta に関するMongoDB Atlas のドキュメント を参照してください。
次の例では、 MongoDB Search集計ステージの nearメタデータを示しています。
Aggregates.searchMeta( SearchOperator.near(2010, 1, fieldPath("year")));
このヘルパーメソッドの詳細については、 searchMeta() APIドキュメント を参照してください。
パイプライン検索ステージの作成
Java ドライバーは、次の演算子のヘルパー メソッドを提供します。
演算子 | 説明 |
|---|---|
不完全な入力 string からの文字シーケンスを含む単語またはフレーズを検索します。 | |
2 つ以上の演算子を 1 つのクエリに結合します。 | |
フィールドが指定した値と一致するかどうかを確認します。 | |
指定されたインデックス付きフィールド名へのパスがドキュメント内に存在するかどうかをテストします。 | |
指定されたパスにあるBSON番号、日付、ブール値、ObjectId、uuid、または string 値の配列を検索し、フィールドの値が指定された配列内の任意の値と等しいドキュメントを返します。 | |
入力ドキュメントに類似するドキュメントを返します。 | |
数値、日付、 GeoJSONポイント値のクエリとスコアリングをサポートします。 | |
インデックス構成で指定されたアナライザを使用して、順序付けられたタームのシーケンスを含むドキュメントを検索します。 | |
インデックス付きフィールドと値の組み合わせのクエリをサポートします。 | |
数値、日付、string 値のクエリとスコアリングをサポートします。 | |
クエリフィールドを 正規式として解釈します。 | |
インデックス構成で指定したアナライザを使用して全文検索を実行します。 | |
検索stringに任意の文字と一致する特殊文字を使用するクエリを有効にします。 |
パイプライン検索ステージの例
この例を実行する前に、moviesコレクションに次の定義を持つMongoDB検索インデックスを作成する必要があります。
{ "mappings": { "dynamic": true, "fields": { "title": { "analyzer": "lucene.keyword", "type": "string" }, "genres": { "normalizer": "lowercase", "type": "token" } } } }
MongoDB Search インデックスの作成の詳細については、インデックスガイドのMongoDB Search および Vector Search インデックスのセクションを参照してください。
次のコードでは、次の仕様を持つ $search ステージが作成されます。
genres配列に"Comedy"が含まれていることを確認fullplotフィールドでフレーズ"new york"を検索します1950から2000までのyear値と一致します"Love"というタームで始まるtitle値を検索します
List<Bson> pipeline = new ArrayList<>(); pipeline.add(Aggregates.search( SearchOperator.compound() .filter( List.of( SearchOperator.in(fieldPath("genres"), "Comedy"), SearchOperator.phrase(fieldPath("fullplot"), "new york"), SearchOperator.numberRange(fieldPath("year")).gtLt(1950, 2000), SearchOperator.wildcard(fieldPath("title"), "Love *") )))); pipeline.add(Aggregates.project( Projections.include("title", "year", "genres") )); AggregateIterable<Document> results = collection.aggregate(pipeline); results.forEach(doc -> System.out.println(doc.toJson()));
{"_id": ..., "genres": ["Comedy", "Romance"], "title": "Love at First Bite", "year": 1979} {"_id": ..., "genres": ["Comedy", "Drama"], "title": "Love Affair", "year": 1994}
MongoDB 検索するヘルパーメソッドの詳細については、ドライバー Core API ドキュメントの SearchOperator インターフェース参照を参照してください。
MongoDB ベクトル検索演算子
SearchOperator クラスの vectorSearch() または vectorSearchExact() 静的メソッドを使用して、$search 集計パイプライン ステージ内でベクトル検索を実行します。これらのメソッドを使用すると、ベクトル類似検索を分析するテキストプレフィルタを使用する演算子を含む、他の MongoDB Search 演算子と組み合わせることができます。
注意
MongoDB ベクトル検索インデックスが必要です
これらのメソッドを使用するには、コレクションに MongoDB Vector Search インデックスを設定する必要があります。ベクトル検索インデックスを作成する方法については、インデックスガイドの「MongoDB Search およびベクトル検索インデックス」セクションを参照してください。
vectorSearch() メソッドを使用して近似最近傍探索(ANN)を実行します。vectorSearchExact() メソッドを使用して厳密最近傍探索(ENN)を実行します。どちらのメソッドも次のパラメータを受け入れます:
Parameter | タイプ | 説明 |
|---|---|---|
|
| 検索するインデックス付きベクトルフィールドへのパス。 |
|
| クエリ ベクトル。次元の数はインデックスされたフィールドと一致する必要があります。 |
|
| 返される結果の最大数。 |
|
| 検索中に考慮する最近傍の数。 |
どちらのメソッドも VectorSearchOperator インスタンスを返します。返されたインスタンスでは、次のメソッドをチェーンできます。
方式 | 説明 |
|---|---|
| ベクトル検索の前にプレフィルターとして |
| ベクトル検索結果にスコア修飾子を適用します。 |
vectorSearch() の例
次の例では、vectorSearch() メソッドを使用して、movies コレクションの plot_embedding フィールドに対して 近似最近傍探索 検索を実行しています。この例では、genres フィールドに対して詞彙プレフィルターとして text 演算子を適用しています。
List<Double> queryVector = List.of( -0.014, -0.055, 0.047, -0.041, 0.027); Bson searchStage = Aggregates.search( SearchOperator.vectorSearch( fieldPath("plot_embedding"), queryVector, 10, 20 ).filter(SearchOperator.text( fieldPath("genres"), "Drama"))); collection.aggregate(List.of(searchStage)) .forEach(result -> System.out.println(result));
vectorSearchExact() 例
次の例では、vectorSearchExact() メソッドを使用して、movies コレクションの plot_embedding フィールドで厳密最近傍探索を実行しています。
List<Double> queryVector = List.of( -0.014, -0.055, 0.047, -0.041, 0.027); Bson searchStage = Aggregates.search( SearchOperator.vectorSearchExact( fieldPath("plot_embedding"), queryVector, 5)); collection.aggregate(List.of(searchStage)) .forEach(result -> System.out.println(result));
詳細情報
MongoDB 検索する の詳細については、Atlas ドキュメントの MongoDB 検索する を参照してください。
API ドキュメント
このガイドで言及されているメソッドについて詳しくは、次のAPIドキュメントを参照してください。