在我的之前的文章里,我探讨了如何在MongoDB中实现基础混合搜索,结合了向量和文本搜索的能力(https://dev.to/shannonlal/optimizing-mongodb-hybrid-search-with-reciprocal-rank-fusion-4p3h)。虽然这种方法有效,但我在获取最相关结果时遇到了一些挑战。本文将讨论我实现的三项重要改进:互反排名融合(RRF)、相似度阈值和搜索类型的权重。
增强型混合搜索的三大关键要素1. 双向排名融合 (RRF)
RRF 是一种技术,它帮助结合来自不同搜索方法的结果。通过考虑结果的排名位置,RRF 与简单相加分数不同,它使用一个公式来给予较高排名的结果更多权重,同时平滑分数差异。
{
$addFields: {
vs_rrf_score: {
$multiply: [
0.4, // vectorWeight
{ $divide: [1.0, { $add: ['$rank', 60] }] },
],
},
},
}
进入全屏模式 退出全屏模式
2. 相似度标准
为了确保高质量的搜索结果,我设置了向量搜索和文本搜索的分数最低阈值。
// 向量搜索阈值 (Vector search threshold)
{
$match: {
向量评分: { $gte: 0.9 }
}
}
// 文本匹配阈值 (Text match threshold)
{
$match: {
文本评分: { $gte: 0.5 }
}
}
切换到全屏模式 退出全屏
这可以防止低质量的匹配出现在结果中,即使它们的RRF计算结果有所提升。比如在之前的例子中,我将向量相似度得分设为0.9,文本相似度得分设为0.5;不过你可以根据自己的数据和搜索效果来调整这些数值。
3. 加权搜索类型
对于不同的查询,不同的搜索类型表现更好。我实现了权重来平衡它们的贡献程度。
{
$addFields: {
combined_score: {
$add: [
{ $multiply: [{ $ifNull: ['$vectorScore', 0] }, 0.4] }, // 向量得分乘以0.4
{ $multiply: [{ $ifNull: ['$textScore', 0] }, 0.6] } // 文本得分乘以0.6
]
}
}
}
全屏模式,退出
在这个例子中,我更重视文本搜索结果,相比之下减少了向量查找的权重,你可以根据自己的测试结果来调整权重。
把一切都放在一起下面是一个简化的整个流程:
[
// 带有阈值的向量搜索
{
$vectorSearch: {
index: 'ai_image_vector_description',
path: 'descriptionValues',
queryVector: embedding,
filter: {
userId: userId,
deleted: false,
}
}
},
{ $match: { vectorScore: { $gte: 0.9 } } },
// 向量搜索中的RRF计算
{
$group: {
_id: null,
docs: { $push: '$ROOT' }
}
},
// ... RRF计算阶段(与向量搜索类似)...
{
$unionWith: {
// 相似结构的文本搜索管道
}
},
// 最终组合和排序步骤
{
$sort: { combined_score: -1 }
}
]
点击这里切换到全屏模式,再点击这里退出全屏模式
好处和成果这种方法带来了几项优势,
- 通过同时考虑排名位置和原始分数获得更相关的结果
- 通过设定最低门槛进行质量控制
- 灵活调整权重以适应不同应用场景
这些技术的组合显著提升了我们的搜索效果,尤其是在简单分数相加的方法未能获得最佳排序的搜索请求中。
下一步是未来可能的一些改进包括:
- 根据查询特征动态调整权重
- 除了简单的阈值外,还包括更多的质量指标
- 针对大规模数据集的性能优化
通过实施这些改进,我们打造了一个更加强大和可靠的混合型搜索系统,更好地满足了用户的需求。