AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

MongoDB Search

このガイドでは、Javaドライバーを使用してコレクションに対してMongoDB 検索クエリを実行する方法を学ぶことができます。MongoDB Search を使用すると、MongoDB Atlasでホストされているコレクションに対して全文検索を実行できます。MongoDB Search 検索インデックスは、検索の動作とインデックスを作成するフィールドを指定します。

このガイドの例では、Atlas のサンプルデータセットから、sample_mflixデータベースのmoviesコレクションを使用します。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 検索クエリを実行します。

  • 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 チュートリアル」を参照してください。

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 つのクエリに結合します。

フィールドが指定した値と一致するかどうかを確認します。equals() メソッドと equalsNull() メソッドにマップされます。

指定されたインデックス付きフィールド名へのパスがドキュメント内に存在するかどうかをテストします。

指定されたパスにあるBSON番号、日付、ブール値、ObjectId、uuid、または string 値の配列を検索し、フィールドの値が指定された配列内の任意の値と等しいドキュメントを返します。

入力ドキュメントに類似するドキュメントを返します。

数値、日付、 GeoJSONポイント値のクエリとスコアリングをサポートします。

インデックス構成で指定されたアナライザを使用して、順序付けられたタームのシーケンスを含むドキュメントを検索します。

インデックス付きフィールドと値の組み合わせのクエリをサポートします。

数値、日付、string 値のクエリとスコアリングをサポートします。numberRange() メソッドと dateRange() メソッドにマップされます。

クエリフィールドを 正規式として解釈します。

インデックス構成で指定したアナライザを使用して全文検索を実行します。

検索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 インターフェース参照を参照してください。

SearchOperator クラスの vectorSearch() または vectorSearchExact() 静的メソッドを使用して、$search 集計パイプライン ステージ内でベクトル検索を実行します。これらのメソッドを使用すると、ベクトル類似検索を分析するテキストプレフィルタを使用する演算子を含む、他の MongoDB Search 演算子と組み合わせることができます。

注意

MongoDB ベクトル検索インデックスが必要です

これらのメソッドを使用するには、コレクションに MongoDB Vector Search インデックスを設定する必要があります。ベクトル検索インデックスを作成する方法については、インデックスガイドの「MongoDB Search およびベクトル検索インデックス」セクションを参照してください。

vectorSearch() メソッドを使用して近似最近傍探索(ANN)を実行します。vectorSearchExact() メソッドを使用して厳密最近傍探索(ENN)を実行します。どちらのメソッドも次のパラメータを受け入れます:

Parameter
タイプ
説明

path

FieldSearchPath

検索するインデックス付きベクトルフィールドへのパス。

queryVector

Iterable<Double>

クエリ ベクトル。次元の数はインデックスされたフィールドと一致する必要があります。

limit

int

返される結果の最大数。

numCandidates

int

検索中に考慮する最近傍の数。vectorSearch() にのみ必要です。この値は limit 以上である必要があります。

どちらのメソッドも VectorSearchOperator インスタンスを返します。返されたインスタンスでは、次のメソッドをチェーンできます。

方式
説明

filter()

ベクトル検索の前にプレフィルターとして SearchOperator を適用します。分析されたテキスト フィールドを使用する演算子を含む、任意のMongoDB Search 演算子を渡すことができます。

score()

ベクトル検索結果にスコア修飾子を適用します。

次の例では、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() メソッドを使用して、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ドキュメントを参照してください。