MongoDB 検索

MongoDB を使用すると、専用の検索インデックスを使用して、キーワード検索や語彙検索、ベクトル検索データを実行できます。

ベクトル検索

MongoDB Vector Search は、$vectorSearch 集計ステージを使用して、特殊なインデックスに対してクエリを実行します。vectorSearch インデックスの要件と制限事項の詳細については、MongoDB のドキュメントを参照してください。

ベクトルインデックスの管理

 MongoTemplate によって実装された SearchIndexOperationsProvider は、ベクトルインデックスを管理するためのさまざまな方法を提供する SearchIndexOperations へのエントリポイントです。

次のスニペットは、コレクションのベクトルインデックスを作成する方法を示しています。

ベクトルインデックスを作成する
  • Java

  • Mongo シェル

VectorIndex index = new VectorIndex("vector_index")
  .addVector("plotEmbedding", vector -> vector.dimensions(1536).similarity(COSINE)) (1)
  .addFilter("year"); (2)

mongoTemplate.searchIndexOps(Movie.class) (3)
  .createIndex(index);
1 ベクトルインデックスは、addVector メソッドを介して追加できる複数のベクトル埋め込みをカバーする場合があります。
2 ベクトルインデックスには、クエリ実行時に検索結果を絞り込むための追加フィールドを含めることができます。
3 フィールド名のマッピングに使用される Movie 型にバインドされた SearchIndexOperations を取得します。
db.movie.createSearchIndex("movie", "vector_index",
  {
    "fields": [
      {
        "type": "vector",
        "numDimensions": 1536,
        "path": "plot_embedding", (1)
        "similarity": "cosine"
      },
      {
        "type": "filter",
        "path": "year"
      }
    ]
  }
)
1 フィールド名 plotEmbedding は、@Field(name = "…​") アノテーションを考慮して plot_embedding にマップされました。

ベクトルインデックスは、exists チェックで true が返されても、作成後すぐには使用できません。検索インデックスの実際の状態は、SearchIndexOperations#status(…​) で取得できます。READY 状態は、インデックスがクエリを受け付ける準備ができていることを示します。

ベクトルインデックスのクエリ

ベクトルインデックスは、次の例に示すように、MongoOperations を介して VectorSearchOperation を使用して集計を発行することで照会できます。

ベクトルインデックスのクエリ
  • Java

  • Mongo シェル

VectorSearchOperation search = VectorSearchOperation.search("vector_index") (1)
  .path("plotEmbedding") (2)
  .vector( ... )
  .numCandidates(150)
  .limit(10)
  .withSearchScore("score"); (3)

AggregationResults<MovieWithSearchScore> results = mongoTemplate
  .aggregate(newAggregation(Movie.class, search), MovieWithSearchScore.class);
1 コレクションには複数のベクトルインデックスが保持される可能性があるため、クエリするベクトルインデックスの名前を指定します。
2 比較に使用されるパスの名前。
3 オプションで、指定された名前の検索スコアを結果ドキュメントに追加します。
db.embedded_movies.aggregate([
  {
    "$vectorSearch": {
      "index": "vector_index",
      "path": "plot_embedding", (1)
      "queryVector": [ ... ],
      "numCandidates": 150,
      "limit": 10
    }
  },
  {
    "$addFields": {
      "score": { $meta: "vectorSearchScore" }
    }
  }
])
1 フィールド名 plotEmbedding は、@Field(name = "…​") アノテーションを考慮して plot_embedding にマップされました。