メタデータフィルター
Mastraは、MongoDB/Siftクエリ構文に基づいて、すべてのベクトルストアにわたる統一されたメタデータフィルタリング構文を提供します。各ベクトルストアは、これらのフィルターをネイティブ形式に変換します。
基本的な例
import { PgVector } from '@mastra/pg';
const store = new PgVector(connectionString);
const results = await store.query({
indexName: "my_index",
queryVector: queryVector,
topK: 10,
filter: {
category: "electronics", // 単純な等価
price: { $gt: 100 }, // 数値比較
tags: { $in: ["sale", "new"] } // 配列メンバーシップ
}
});
サポートされている演算子
基本比較
演算子 | 説明 | 例 | サポート |
---|---|---|---|
$eq | 指定された値と等しい値に一致 |
| All |
$ne | 等しくない値に一致 |
| All |
$gt | より大きい |
| All |
$gte | 以上 |
| All |
$lt | より小さい |
| All |
$lte | 以下 |
| All |
配列演算子
演算子 | 説明 | 例 | サポート |
---|---|---|---|
$in | 配列内の任意の値に一致 |
| All |
$nin | いずれの値にも一致しない |
| All |
$all | すべての要素を含む配列に一致 |
| AstraPineconeUpstash |
$elemMatch | 条件を満たす配列要素に一致 |
| LibSQLPgVector |
論理演算子
演算子 | 説明 | 例 | サポート |
---|---|---|---|
$and | 論理 AND |
| All except Vectorize |
$or | 論理 OR |
| All except Vectorize |
$not | 論理 NOT |
| AstraQdrantUpstashPgVectorLibSQL |
$nor | 論理 NOR |
| QdrantUpstashPgVectorLibSQL |
要素演算子
演算子 | 説明 | 例 | サポート |
---|---|---|---|
$exists | フィールドを持つドキュメントに一致 |
| All except Vectorize, Chroma |
カスタムオペレーター
演算子 | 説明 | 例 | サポート |
---|---|---|---|
$contains | テキストが部分文字列を含む |
| UpstashLibSQLPgVector |
$regex | 正規表現の一致 |
| QdrantPgVectorUpstash |
$size | 配列の長さのチェック |
| AstraLibSQLPgVector |
$geo | 地理空間クエリ |
| Qdrant |
$datetime | 日時範囲クエリ |
| Qdrant |
$hasId | ベクトルIDの存在チェック |
| Qdrant |
$hasVector | ベクトルの存在チェック |
| Qdrant |
共通のルールと制限
-
フィールド名は以下を含むことができません:
- ドット (.) を含むこと(ネストされたフィールドを参照する場合を除く)
- $ で始まる、またはヌル文字を含むこと
- 空の文字列であること
-
値は以下でなければなりません:
- 有効なJSONタイプ(文字列、数値、ブール値、オブジェクト、配列)
- 未定義でないこと
- 演算子に対して適切に型付けされていること(例:数値比較には数値)
-
論理演算子:
- 有効な条件を含むこと
- 空でないこと
- 適切にネストされていること
- トップレベルまたは他の論理演算子内にネストされて使用されること
- フィールドレベルまたはフィールド内にネストされて使用されないこと
- 演算子内で使用されないこと
- 有効:
{ "$and": [{ "field": { "$gt": 100 } }] }
- 有効:
{ "$or": [{ "$and": [{ "field": { "$gt": 100 } }] }] }
- 無効:
{ "field": { "$and": [{ "$gt": 100 }] } }
- 無効:
{ "field": { "$gt": { "$and": [{...}] } } }
-
$not 演算子:
- オブジェクトでなければならない
- 空でないこと
- フィールドレベルまたはトップレベルで使用できる
- 有効:
{ "$not": { "field": "value" } }
- 有効:
{ "field": { "$not": { "$eq": "value" } } }
-
演算子のネスト:
- 論理演算子はフィールド条件を含む必要があり、直接演算子を含むことはできない
- 有効:
{ "$and": [{ "field": { "$gt": 100 } }] }
- 無効:
{ "$and": [{ "$gt": 100 }] }
ストア固有の注意事項
Astra
- ネストされたフィールドクエリはドット表記を使用してサポートされています
- 配列フィールドはメタデータで明示的に配列として定義する必要があります
- メタデータの値は大文字と小文字を区別します
ChromaDB
- Whereフィルターは、フィルターされたフィールドがメタデータに存在する結果のみを返します
- 空のメタデータフィールドはフィルター結果に含まれません
- メタデータフィールドは否定的な一致のために存在する必要があります(例:$neはフィールドが欠けているドキュメントに一致しません)
Cloudflare Vectorize
- フィルタリングを使用する前に明示的なメタデータインデックス作成が必要です
- フィルタリングしたいフィールドをインデックスするには
createMetadataIndex()
を使用します - Vectorizeインデックスごとに最大10のメタデータインデックス
- 文字列値は最初の64バイトまでインデックスされます(UTF-8の境界で切り捨て)
- 数値値はfloat64精度を使用します
- フィルタJSONは2048バイト未満でなければなりません
- フィールド名にはドット(.)を含めたり、$で始めたりすることはできません
- フィールド名は512文字に制限されています
- 新しいメタデータインデックスを作成した後、ベクトルはフィルタリングされた結果に含めるために再アップサートする必要があります
- 非常に大きなデータセット(約10M+ベクトル)では範囲クエリの精度が低下する可能性があります
LibSQL
- ドット表記を使用したネストされたオブジェクトクエリをサポートしています
- 配列フィールドは有効なJSON配列を含むことを確認するために検証されます
- 数値比較は適切な型処理を維持します
- 条件内の空の配列は適切に処理されます
- メタデータは効率的なクエリのためにJSONB列に格納されます
PgVector
- PostgreSQLのネイティブJSONクエリ機能を完全にサポートしています
- ネイティブ配列関数を使用した配列操作の効率的な処理
- 数値、文字列、ブール値の適切な型処理
- ネストされたフィールドクエリはPostgreSQLのJSONパス構文を内部的に使用します
- メタデータは効率的なインデックス作成のためにJSONB列に格納されます
Pinecone
- メタデータフィールド名は512文字に制限されています
- 数値値は±1e38の範囲内でなければなりません
- メタデータ内の配列は合計64KBのサイズに制限されています
- ネストされたオブジェクトはドット表記でフラット化されます
- メタデータの更新はメタデータオブジェクト全体を置き換えます
Qdrant
- ネストされた条件を使用した高度なフィルタリングをサポートしています
- ペイロード(メタデータ)フィールドはフィルタリングのために明示的にインデックスする必要があります
- 地理空間クエリの効率的な処理
- nullおよび空の値の特別な処理
- ベクトル固有のフィルタリング機能
- 日時値はRFC 3339形式でなければなりません
Upstash
- メタデータフィールドキーの512文字制限
- クエリサイズは制限されています(大きなIN句を避ける)
- フィルターでnull/undefined値をサポートしていません
- 内部的にSQLライクな構文に変換されます
- 大文字と小文字を区別する文字列比較
- メタデータの更新はアトミックです