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

MongoDB ベクトル検索クエリを実行する

このガイドでは、Mongoid を使用して MongoDB ベクトル検索クエリを実行する方法を学ぶことができます。MongoDB ベクトル検索を使用すると、ベクトル埋め込みを使用してドキュメントの意味論的な意味に基づいてクエリすることができます。

Mongoid には、vector_search メソッドが用意されています。このメソッドは、$vectorSearch 集計ステージをビルドして実行します。$vectorSearch 集計ステージの詳細については、集計操作ガイドを参照してください。

注意

配置の互換性

MongoDB ベクトル検索を使用するには、MongoDB Atlas クラスターまたは MongoDB 8.2 以降を実行する自己管理型配置に接続する必要があります。

MongoDB ベクトル検索の詳細については、Atlas ドキュメントの「MongoDB ベクトル検索の概要」を参照してください。

MongoDB ベクトル検索クエリを実行する前に、モデルでベクトル フィールドとベクトル検索インデックスを定義し、その後にコレクションでインデックスを作成する必要があります。ベクトル検索インデックスを宣言および作成する方法を学ぶには、インデックスガイドの「MongoDB ベクトル検索インデックス」セクションを参照してください。

このガイドの例では、sample_mflix データベースの embedded_movies コレクションにマップされる次の Movie モデルを使用します。plot_embedding フィールドには、各映画のあらすじのベクトル埋め込みが保存されています。

class Movie
include Mongoid::Document
store_in collection: "embedded_movies", database: "sample_mflix"
field :title, type: String
field :plot, type: String
field :year, type: Integer
field :plot_embedding, type: Array
# Declare a vector search index on the `plot_embedding` field. The `_id`
# and `year` filter fields enable instance-level and filtered queries.
vector_search_index :plot_embedding_index,
fields: [
{
type: "vector",
path: "plot_embedding",
numDimensions: 1536,
similarity: "cosine"
},
{
type: "filter",
path: "_id"
},
{
type: "filter",
path: "year"
}
]
end

Tip

Atlas サンプル データ

サンプルデータをロードする方法については、Atlas sample_mflixドキュメントの「 Atlas へのデータのロード 」チュートリアルを参照してください。

MongoDB ベクトル検索クエリを実行するには、モデルで vector_search クラス メソッドを呼び出し、クエリ ベクトルを最初の引数として渡します。クエリ ベクトルは、検索入力を表すベクトル埋め込みです。

次のコード例は、plot_embeddingフィールドに対してMongoDBベクトル検索クエリを実行し、一致する各映画のタイトルを出力します。Movieモデルでは1つのベクトル検索インデックスのみが宣言されているため、Mongoidは使用するインデックスとベクトルフィールドを自動的に選択します。

# The query vector must have the same number of dimensions as the
# vector search index (1536, in this example).
query_vector = [ -0.0016261312, -0.028070757, -0.011342932, ..., -0.009710136 ]
movies = Movie.vector_search(query_vector, limit: 5)
movies.each do |movie|
puts movie.title
end

vector_search メソッドは Movie ドキュメントの配列を返します。デフォルトでは、10 個の最も類似したドキュメントが返されます。結果の数を変更するには、limit オプションを設定します。前の例では、5 個の結果の制限を指定しています。

vector_search が返す各ドキュメントには、ドキュメントがクエリ ベクトルにどの程度一致するかを説明する vector_search_score 属性があります。スコアが高いほど一致度が高くなります。

次のコードは前の例と同じクエリを実行しますが、一致する各映画のタイトルとスコアを出力します。

movies = Movie.vector_search(query_vector, limit: 5)
movies.each do |movie|
puts "#{movie.title}: #{movie.vector_search_score}"
end

ドキュメント インスタンスで vector_search メソッドを呼び出して、そのドキュメントに似ているドキュメントを検索することもできます。ドキュメントで vector_search を呼び出すと、Mongoidはドキュメント自身の保存されたベクトルをクエリ ベクトルとして使用し、ドキュメント自身を結果から除外します。

次のコードは、既存の Movie ドキュメントに最も類似する 5 本の映画を検索します。

movie = Movie.find_by(title: "About Time")
neighbors = movie.vector_search(limit: 5)
neighbors.each do |neighbor|
puts neighbor.title
end

クエリをカスタマイズするには、次のキーワード引数を vector_search メソッドに渡すことができます。

オプション
タイプ
説明
デフォルト値

index

String or Symbol

使用するベクトル検索インデックスの名前。モデルが複数のベクトル検索インデックスを宣言している場合にのみ必要です。

モデルから推計されました

path

String or Symbol

ベクトル埋め込みを含むフィールド。インデックス定義からベクトル フィールドを推計できない場合にのみ必要です。

インデックスから推計されました

limit

Integer

返されるドキュメントの最大数。

10

num_candidates

Integer

検索時に考慮する最近傍の数。

limit * 10

filter

Hash

検索前にドキュメントを事前フィルターするに使用されるクエリ。

フィルタリングなし

pipeline

Array

ベクトル検索の後に追加する追加の集計ステージ。

追加のステージはありません

次のコードは、150候補を考慮し、2000年以降に公開された映画のみを返す MongoDB ベクトル検索クエリを実行します。

movies = Movie.vector_search(
query_vector,
limit: 5,
num_candidates: 150,
filter: { year: { "$gt" => 2000 } }
)

To learn more about these options, see the Fields section of the $vectorSearch operator reference in the Atlas documentation.

ベクトル検索インデックスを宣言および作成する方法を学ぶには、インデックスガイドの「MongoDB ベクトル検索インデックス」セクションを参照してください。

このガイドで言及されている概念についてさらに学ぶには、Atlas ドキュメントの次のページを参照してください。

このガイドで言及されているメソッドについて詳しくは、次のAPIドキュメントを参照してください。