
🧠 记忆锚点:语义找相关,关键词保精确,元数据守约束;先保证过滤正确,再融合重排。
💡 答案要点
混合搜索 = 向量检索 + 标量过滤 + 关键词检索 融合
为什么需要混合搜索?
用户问题:"帮我找2024年发布的、关于AI大模型的学术论文"
向量检索(语义):找出"关于AI大模型的学术论文"
→ 找到语义相关的文档
→ 但可能包含2023年或2025年的
标量过滤(metadata filter):"2024年"
→ 按时间过滤,只保留2024年的
混合搜索 = 语义相关 + 时间符合 = 精准答案实现方式对比:
展开 Python 代码示例(35 行)
python
# Pinecone 混合搜索
index.query(
vector=query_emb,
filter={"year": {"$eq": 2024}, "category": "论文"}, # 标量过滤
top_k=10,
include_metadata=True
)
# Milvus 混合搜索
search_params = {
"metric_type": "IP",
"params": {"nprobe": 10}
}
results = collection.search(
data=[query_emb],
anns_field="embedding",
expr='year == 2024 and category == "论文"', # 标量过滤表达式
search_params=search_params,
top_k=10
)
# Qdrant 混合搜索(原生支持,最灵活)
from qdrant_client import QdrantClient
client = QdrantClient("localhost", port=6333)
results = client.search(
collection_name="papers",
query_vector=query_emb,
query_filter={
"must": [
{"key": "year", "match": {"value": 2024}},
{"key": "category", "match": {"value": "论文"}}
]
},
top=10
)为什么 Qdrant 混合搜索更强?
python
# Qdrant 支持复杂条件组合
{
"must": [ # AND
{"key": "year", "range": {"gte": 2023, "lte": 2025}},
{"key": "authors", "match": {"any": ["张三", "李四"]}}
],
"should": [ # OR(加分项)
{"key": "cited_by", "range": {"gt": 100}}
],
"must_not": [ # NOT
{"key": "status", "match": {"value": "draft"}}
]
}
# Pinecone 和 Milvus 的过滤表达能力不如 Qdrant面试话术:
"当查询同时包含语义、精确词项或结构化条件时,混合检索和元数据过滤值得评估;但不是所有场景都必须混合。选数据库时应检查过滤是在 ANN 前、中还是后执行,以及过滤选择性对召回和延迟的影响,而不是只比较表达式语法。"