元数据过滤 #
什么是元数据过滤? #
元数据过滤允许你在向量搜索时,根据向量的元数据进行精确过滤,只返回符合条件的结果。
text
┌─────────────────────────────────────────────────────────────┐
│ 元数据过滤流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 查询向量 过滤条件 返回结果 │
│ │
│ [0.1, 0.2, ...] ───────────────> 相似 + 符合条件 │
│ │ │ │ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 向量 │ │ 元数据 │ │ 过滤后 │ │
│ │ 相似性 │ + │ 条件 │ = │ 的相似 │ │
│ │ 搜索 │ │ 过滤 │ │ 结果 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ 示例: │
│ 查询向量 + {"category": "tech", "year": {"$gte": 2023}} │
│ = 返回科技类别且 2023 年后的相似向量 │
│ │
└─────────────────────────────────────────────────────────────┘
元数据类型 #
text
┌─────────────────────────────────────────────────────────────┐
│ 支持的元数据类型 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 字符串(String): │
│ { "title": "Pinecone 教程", "category": "database" } │
│ │
│ 数字(Number): │
│ { "views": 1000, "rating": 4.5, "year": 2024 } │
│ │
│ 布尔值(Boolean): │
│ { "published": true, "featured": false } │
│ │
│ 字符串列表(List of Strings): │
│ { "tags": ["AI", "ML", "database"] } │
│ │
│ 限制: │
│ - 单个元数据最大 40KB │
│ - 字符串值最大 1000 字符 │
│ - 列表最多 1000 个元素 │
│ │
└─────────────────────────────────────────────────────────────┘
过滤操作符 #
比较操作符 #
text
┌─────────────────────────────────────────────────────────────┐
│ 比较操作符 │
├─────────────────────────────────────────────────────────────┤
│ │
│ $eq(等于) │
│ { "category": { "$eq": "technology" } } │
│ 简写: { "category": "technology" } │
│ │
│ $ne(不等于) │
│ { "status": { "$ne": "deleted" } } │
│ │
│ $gt(大于) │
│ { "views": { "$gt": 1000 } } │
│ │
│ $gte(大于等于) │
│ { "rating": { "$gte": 4.0 } } │
│ │
│ $lt(小于) │
│ { "price": { "$lt": 100 } } │
│ │
│ $lte(小于等于) │
│ { "year": { "$lte": 2023 } } │
│ │
└─────────────────────────────────────────────────────────────┘
数组操作符 #
text
┌─────────────────────────────────────────────────────────────┐
│ 数组操作符 │
├─────────────────────────────────────────────────────────────┤
│ │
│ $in(在列表中) │
│ { "category": { "$in": ["tech", "science", "AI"] } } │
│ │
│ $nin(不在列表中) │
│ { "status": { "$nin": ["deleted", "archived"] } } │
│ │
│ 注意: │
│ - $in 和 $nin 适用于字符串和数字 │
│ - 列表最多 100 个元素 │
│ │
└─────────────────────────────────────────────────────────────┘
逻辑操作符 #
text
┌─────────────────────────────────────────────────────────────┐
│ 逻辑操作符 │
├─────────────────────────────────────────────────────────────┤
│ │
│ $and(且) │
│ { │
│ "$and": [ │
│ { "category": "tech" }, │
│ { "views": { "$gte": 1000 } } │
│ ] │
│ } │
│ │
│ $or(或) │
│ { │
│ "$or": [ │
│ { "author": "John" }, │
│ { "author": "Jane" } │
│ ] │
│ } │
│ │
│ $not(非) │
│ { │
│ "$not": { "category": "spam" } │
│ } │
│ │
└─────────────────────────────────────────────────────────────┘
基本过滤示例 #
单条件过滤 #
python
from pinecone import Pinecone
pc = Pinecone(api_key="your-api-key")
index = pc.Index("my-index")
results = index.query(
vector=query_vector,
top_k=10,
filter={
"category": "technology"
},
include_metadata=True
)
多条件过滤 #
python
results = index.query(
vector=query_vector,
top_k=10,
filter={
"category": "technology",
"views": {"$gte": 1000},
"published": True
},
include_metadata=True
)
范围过滤 #
python
results = index.query(
vector=query_vector,
top_k=10,
filter={
"year": {"$gte": 2020, "$lte": 2024},
"rating": {"$gte": 4.0}
},
include_metadata=True
)
列表过滤 #
python
results = index.query(
vector=query_vector,
top_k=10,
filter={
"category": {"$in": ["technology", "science", "AI"]},
"tags": {"$in": ["tutorial", "guide"]}
},
include_metadata=True
)
复杂过滤示例 #
组合逻辑条件 #
python
results = index.query(
vector=query_vector,
top_k=10,
filter={
"$and": [
{
"$or": [
{"category": "technology"},
{"category": "science"}
]
},
{"views": {"$gte": 500}},
{
"$not": {"status": "archived"}
}
]
},
include_metadata=True
)
多层嵌套条件 #
python
results = index.query(
vector=query_vector,
top_k=10,
filter={
"$and": [
{
"$or": [
{
"$and": [
{"category": "technology"},
{"level": "advanced"}
]
},
{
"$and": [
{"category": "science"},
{"level": "beginner"}
]
}
]
},
{"published": True}
]
},
include_metadata=True
)
排除条件 #
python
results = index.query(
vector=query_vector,
top_k=10,
filter={
"$and": [
{"category": {"$in": ["tech", "science"]}},
{"status": {"$nin": ["deleted", "archived", "draft"]}},
{"author": {"$ne": "spam_user"}}
]
},
include_metadata=True
)
实际应用场景 #
电商商品搜索 #
python
def search_products(query_vector, filters=None, top_k=20):
default_filters = {
"in_stock": True,
"price": {"$lte": 1000}
}
if filters:
default_filters.update(filters)
results = index.query(
vector=query_vector,
top_k=top_k,
filter=default_filters,
include_metadata=True
)
return results
results = search_products(
query_vector,
filters={
"category": {"$in": ["electronics", "computers"]},
"brand": {"$in": ["Apple", "Samsung", "Sony"]},
"rating": {"$gte": 4.0}
}
)
内容推荐系统 #
python
def get_recommendations(user_vector, user_preferences, top_k=10):
filters = {
"published": True,
"language": user_preferences.get("language", "en"),
"$or": [
{"category": {"$in": user_preferences.get("interests", [])}},
{"tags": {"$in": user_preferences.get("interests", [])}}
]
}
if user_preferences.get("min_rating"):
filters["rating"] = {"$gte": user_preferences["min_rating"]}
results = index.query(
vector=user_vector,
top_k=top_k,
filter=filters,
include_metadata=True
)
return results
多租户数据隔离 #
python
def query_tenant_data(tenant_id, query_vector, filters=None, top_k=10):
tenant_filter = {"tenant_id": tenant_id}
if filters:
tenant_filter = {
"$and": [
{"tenant_id": tenant_id},
filters
]
}
results = index.query(
vector=query_vector,
top_k=top_k,
filter=tenant_filter,
include_metadata=True
)
return results
时间范围过滤 #
python
from datetime import datetime, timedelta
def search_recent_content(query_vector, days=30, top_k=10):
cutoff_date = (datetime.now() - timedelta(days=days)).strftime("%Y-%m-%d")
results = index.query(
vector=query_vector,
top_k=top_k,
filter={
"published_date": {"$gte": cutoff_date},
"status": "published"
},
include_metadata=True
)
return results
性能优化 #
过滤优先原则 #
text
┌─────────────────────────────────────────────────────────────┐
│ 性能优化建议 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 使用过滤减少搜索空间 │
│ │
│ 不推荐: │
│ results = index.query(vector=v, top_k=100) │
│ filtered = [r for r in results if condition] │
│ │
│ 推荐: │
│ results = index.query( │
│ vector=v, │
│ top_k=10, │
│ filter=condition │
│ ) │
│ │
│ 2. 选择性过滤 │
│ │
│ - 使用高选择性的过滤条件 │
│ - 先过滤掉大部分不相关数据 │
│ - 减少向量相似度计算量 │
│ │
│ 3. 索引元数据 │
│ │
│ - 常用于过滤的字段放在元数据中 │
│ - 避免存储过大的元数据 │
│ │
└─────────────────────────────────────────────────────────────┘
过滤条件设计 #
python
def optimized_search(query_vector, categories, min_views, top_k=10):
filters = {
"category": {"$in": categories},
"views": {"$gte": min_views},
"status": "published"
}
results = index.query(
vector=query_vector,
top_k=top_k,
filter=filters,
include_metadata=True
)
return results
过滤工具类 #
python
class MetadataFilterBuilder:
def __init__(self):
self.conditions = []
def eq(self, field, value):
self.conditions.append({field: value})
return self
def ne(self, field, value):
self.conditions.append({field: {"$ne": value}})
return self
def gt(self, field, value):
self.conditions.append({field: {"$gt": value}})
return self
def gte(self, field, value):
self.conditions.append({field: {"$gte": value}})
return self
def lt(self, field, value):
self.conditions.append({field: {"$lt": value}})
return self
def lte(self, field, value):
self.conditions.append({field: {"$lte": value}})
return self
def in_list(self, field, values):
self.conditions.append({field: {"$in": values}})
return self
def not_in(self, field, values):
self.conditions.append({field: {"$nin": values}})
return self
def build(self):
if len(self.conditions) == 0:
return {}
elif len(self.conditions) == 1:
return self.conditions[0]
else:
return {"$and": self.conditions}
filter_builder = MetadataFilterBuilder()
filters = (filter_builder
.eq("category", "technology")
.gte("views", 1000)
.in_list("tags", ["AI", "ML"])
.build()
)
results = index.query(
vector=query_vector,
top_k=10,
filter=filters
)
Node.js 示例 #
javascript
const { Pinecone } = require('@pinecone-database/pinecone');
async function metadataFilterExample() {
const pc = new Pinecone({
apiKey: process.env.PINECONE_API_KEY
});
const index = pc.index('my-index');
const results = await index.query({
vector: [0.1, 0.2, 0.3],
topK: 10,
includeMetadata: true,
filter: {
$and: [
{ category: { $in: ['technology', 'science'] } },
{ views: { $gte: 1000 } },
{ published: true }
]
}
});
console.log(`找到 ${results.matches.length} 个结果`);
results.matches.forEach(match => {
console.log(`ID: ${match.id}`);
console.log(`Score: ${match.score}`);
console.log(`Category: ${match.metadata.category}`);
console.log('---');
});
}
metadataFilterExample();
下一步 #
现在你已经掌握了元数据过滤,接下来学习 集成应用,了解如何将 Pinecone 与 OpenAI、LangChain 等工具集成!
最后更新:2026-04-04