混合搜索是针对相同或相似查询条件的不同搜索方法或搜索查询的聚合。该技术利用算法对结果进行排序,并从不同的搜索方法中返回统一的结果。您可以使用 $rankFusion 执行混合搜索。
什么是倒数排名融合?
倒数排名融合是一种技术,通过执行以下操作,将不同搜索方法的结果合并为一个结果集:
计算结果中各个文档的倒数排名。
对于每个搜索结果中每个排名的文档,首先将该文档的排名 (
r) 与一个常数60相加,以平滑分数 (rank_constant),然后将1除以r与rank_constant之和,得出该文档在搜索结果中的倒数排名。您无法设置rank_constant的值,默认值为60。reciprocal_rank = 1 / ( r + rank_constant ) 对于每种搜索方法,应用不同的权重 (
w) 以使该搜索方法占更大重要性。对于每个文档,加权倒数排名的计算方法是将权重乘以文档的倒数排名。weighted_reciprocal_rank = w x reciprocal_rank 将结果中文档的派生排名分数和加权分数相结合。
对于所有搜索结果中的每个文档,将计算出的倒数排名相加,获得文档的单个分数。
按结果中文档的综合得分对结果进行排序。
根据结果中的综合得分对结果中的文档进行排序,以获得结果中文档的单一综合排名列表。
关于不同的混合搜索应用场景
您可以利用 Atlas Vector Search 执行多种类型的混合搜索。具体而言,Atlas Vector Search 支持以下应用场景:
在单个查询中进行全文和向量搜索:您可以合并不同搜索方法的结果,如语义搜索和全文搜索。您可以使用
$vectorSearch进行语义搜索,使用$search进行全文搜索,并通过倒数排名融合技术将结果整合。要了解更多信息,请参阅使用 Atlas Vector Search 和 Atlas Search 执行混合搜索教程,该教程演示了如何对sample_mflix.embedded_movies命名空间执行语义搜索和全文搜索,并使用倒数排名融合技术来检索组合结果。在单个 MongoDB
$rankFusion管道中进行多个向量搜索查询:MongoDB 管道支持多个子管道,这些子管道包含针对同一集合执行的向量搜索查询,并使用倒数排名融合技术合并结果。如何组合多个$vectorSearch查询教程演示了以下类型的向量搜索:对您的数据集进行全面搜索,以在同一查询中查找语义相似的术语。
在数据集中搜索多个字段,以确定哪些字段为查询返回最佳结果。
使用不同嵌入模型生成的嵌入向量进行搜索,以确定不同模型在语义解释上的差异。
Considerations
在使用 $rankFusion 管道阶段进行混合搜索时,请考虑以下事项。
互斥结果集
如果想捕捉一种搜索方法无法捕捉到的漏报,从单个子管道获得不相交的结果可能是可以接受的。当结果不相交时,大部分或所有结果可能会显示为从一个管道返回,而不是从另一个管道返回。但是,如果您希望所有子管道返回类似的结果,请尝试增加每个子管道的结果数量。
权重
我们建议基于每个查询动态权衡词法查询与向量查询的权重,而非对所有查询采用固定权重,从而提升每个查询结果的相关性。这样还能将资源分配给最需要的查询,从而提高计算资源的利用率。
多个管道
您可以在 $rankFusion 阶段将任意数量的子管道组合在一起,但它们必须针对同一个集合执行。您不能使用 $rankFusion 阶段来跨集合进行搜索。使用 $unionWith 阶段与 $vectorSearch 进行跨集合搜索。
非搜索管道
地理空间相关性
您可以使用 $geoNear 和 near $search操作符在 $rankFusion 阶段进行地理位置搜索。然而,$geoNear 和 near 操作符使用不同的坐标参考系。因此,结果序号和分数可能不完全相同。
限制结果
我们建议为每个子管道返回的结果数量设定限制。
限制
以下限制适用于使用 $rankFusion 的混合搜索:
$rankFusion仅支持 MongoDB 8.1+(包括最新的快速发布)。$rankFusion子管道只能包含以下管道阶段:$rankFusion保留每个子管道的原始输入文档的可追溯链接。因此,它不支持以下内容:$project阶段storedSource 字段
$rankFusion子管道串行运行,而不是并行运行。$rankFusion不支持分页。
先决条件
要试用这些教程,必须具备以下条件:
一个 MongoDB 版本为 v8.1.0 或更高版本的 Atlas 集群。
sample_mflix 数据库已加载到 Atlas 集群。
mongosh在您的 Atlas 集群上尝试这些查询。注意
您还可以通过使用 Atlas CLI 创建的本地 Atlas 部署来尝试这些混合搜索用例。要了解详情,请参阅创建本地 Atlas 部署。