混合搜索是针对相同或相似查询条件的不同搜索方法或搜索查询的聚合。该技术利用算法对结果进行排序,并从不同的搜索方法中返回统一的结果。您可以使用 $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 将结果中文档的派生排名分数和加权分数相结合。
对于所有搜索结果中的每个文档,将计算出的倒数排名相加,获得文档的单个分数。
按结果中文档的综合得分对结果进行排序。
根据结果中的综合得分对结果中的文档进行排序,以获得结果中文档的单一综合排名列表。
关于不同的混合搜索应用场景
您可以利用MongoDB Vector Search 来执行多种类型的混合搜索。具体来说, MongoDB Vector Search 支持以下使用案例:
在单个查询中进行全文搜索和向量搜索:您可以合并不同搜索方法(例如语义搜索和全文搜索)的结果。您可以将
$vectorSearch用于语义搜索,将$search用于全文搜索结果,并使用倒数排名融合技术合并结果。要学习;了解更多信息,请参阅使用MongoDB Vector Search 和MongoDB Search 执行混合搜索教程,该教程演示了如何针对sample_mflix.embedded_movies命名空间执行语义搜索和全文搜索,并使用倒数排名融合检索组合的排名检索。或者,对于更细粒度的混合搜索,其中除了结果的相对顺序之外,分数也很重要,您可以使用
$scoreFusion管道阶段。要学习;了解更多信息,请参阅使用MongoDB Vector Search 和MongoDB Search 执行混合搜索教程,该教程演示了如何对sample_mflix.embedded_movies命名空间执行语义搜索和全文搜索,并将输入管道结果检索到最终评分结果设立。$rankFusion使用倒数排名融合算法根据文档在输入管道中的位置(相对排名)对文档进行排名,$scoreFusion根据输入管道分配的分数对文档进行排名,并使用数学表达式组合结果。在
$rankFusion中,排名受管道权重影响。在$scoreFusion中,权重控制每个管道的分数对最终结果的贡献。在单个 MongoDB
$rankFusion管道中进行多个向量搜索查询:MongoDB 管道支持多个子管道,这些子管道包含针对同一集合执行的向量搜索查询,并使用倒数排名融合技术合并结果。如何组合多个$vectorSearch查询教程演示了以下类型的向量搜索:对您的数据集进行全面搜索,以在同一查询中查找语义相似的术语。
在数据集中搜索多个字段,以确定哪些字段为查询返回最佳结果。
使用不同嵌入模型生成的嵌入向量进行搜索,以确定不同模型在语义解释上的差异。
Considerations
使用 $rankFusion 或 $scoreFusion管道阶段进行混合搜索时,请考虑以下事项。
互斥结果集
如果想捕捉一种搜索方法无法捕捉到的漏报,从单个子管道获得不相交的结果可能是可以接受的。当结果不相交时,大部分或所有结果可能会显示为从一个管道返回,而不是从另一个管道返回。但是,如果您希望所有子管道返回类似的结果,请尝试增加每个子管道的结果数量。
权重
我们建议基于每个查询动态权衡词法查询与向量查询的权重,而非对所有查询采用固定权重,从而提升每个查询结果的相关性。这样还能将资源分配给最需要的查询,从而提高计算资源的利用率。
多个管道
您可以在 $rankFusion 或 $scoreFusion 阶段将任意数量的子管道组合在一起,但它们必须全部针对同一个集合执行。不能使用 $rankFusion 或 $scoreFusion 阶段跨集合搜索。使用 $unionWith 阶段和 $vectorSearch 进行跨集合搜索。
非搜索管道
地理空间相关性
您可以使用$geoNear 和 $search中的邻近操作符在$rankFusion 或$scoreFusion 阶段进行位置搜索。但是,$geoNear 和 near 操作符使用不同的坐标参考系。因此,结果序数和分数可能不同。
限制结果
我们建议为每个子管道返回的结果数量设定限制。
限制
以下限制应用于使用 $rankFusion 和 $scoreFusion 的混合搜索:
$rankFusion仅MongoDB 8.0 及更高版本(包括带自动升级功能的最新版本)支持。注意
您必须打开支持案例才能在 8.0.X 版本上使用
$rankFusion。从 8.0升级时,您可能必须暂停执行$rankFusion查询。$rankFusion和$scoreFusion子管道只能包含以下阶段:$rankFusion并$scoreFusion为每个子管道保留指向原始输入文档的可追踪链接。因此,它不支持以下操作:$project阶段storedSource 字段
$rankFusion和$scoreFusion子管道串行运行,而不是并行运行。$rankFusion且$scoreFusion不支持分页。rankFusion只能在运行MongoDB 8.0 或更高版本的集群上的视图上运行。无法在视图定义内或时间序列集合上运行rankFusion。
先决条件
要试用这些教程,必须具备以下条件:
MongoDB版本 v8.0 或更高版本的集群。
sample_mflix数据库已加载到集群中。
mongosh在集群上尝试查询。注意
您还可以在使用Atlas CLI创建的本地Atlas部署和自托管(本地部署)部署中尝试这些混合搜索使用案例。要学习;了解更多信息,请参阅创建本地Atlas部署。