1、近似近邻(ANN)搜索
近似近邻(ANN)搜索以记录向量嵌入排序顺序的索引文件为基础,根据接收到的搜索请求中携带的查询向量查找向量嵌入子集,将查询向量与子群中的向量进行比较,并返回最相似的结果。
2、过滤搜索
ANN 搜索能找到与指定向量嵌入最相似的向量嵌入。但是,搜索结果不一定总是正确的。您可以在搜索请求中包含过滤条件,这样 Milvus 就会在进行 ANN 搜索前进行元数据过滤,将搜索范围从整个 Collections 缩小到只搜索符合指定过滤条件的实体。
如果 Collections 同时包含向量嵌入及其元数据,您可以在 ANN 搜索之前过滤元数据,以提高搜索结果的相关性。Milvus 收到携带过滤条件的搜索请求后,会将搜索范围限制在符合指定过滤条件的实体内。

如上图所示,搜索请求携带 chunk like % red % 作为过滤条件,表明 Milvus 应在 chunk 字段中包含 red 的所有实体内进行 ANN 搜索。具体来说,Milvus 会执行以下操作。
- 过滤符合搜索请求中过滤条件的实体。
- 在过滤后的实体中进行 ANN 搜索。
- 返回前 K 个实体。
基本操作符
Milvus 支持几种用于过滤数据的基本操作符。
- 比较操作符 :==,!=,>,<,>=, 和 <= 允许基于数字、文本或日期字段进行筛选。
- 范围过滤器 :IN 和 LIKE 可帮助匹配特定的值范围或集合。
- 算术操作符 :+,-,*,/,%, 和 `` 用于涉及数字字段的计算。
- 逻辑操作符 :AND,OR, 和 NOT 或 '&&'、'||'、'~'、'!'将多个条件组合成复杂的表达式。
filter = "age > 25 and city in ['北京', '上海']"
3、全文搜索 (BM25)
全文搜索是一种在文本数据集中检索包含特定术语或短语的文档,然后根据相关性对结果进行排序的功能。该功能克服了语义搜索可能会忽略精确术语的局限性,确保您获得最准确且与上下文最相关的结果。此外,它还通过接受原始文本输入来简化向量搜索,自动将您的文本数据转换为稀疏嵌入,而无需手动生成向量嵌入。
该功能使用 BM25 算法进行相关性评分,在检索增强生成 (RAG) 场景中尤为重要,它能优先处理与特定搜索词密切匹配的文档。
全文搜索在 Milvus Standalone 和 Milvus Distributed 中可用,但在 Milvus Lite 中不可用

要使用全文搜索,请遵循以下主要步骤。
search_params = {
'params': {'drop_ratio_search': 0.2}, # Proportion of small vector values to ignore during the search
}
client.search(
collection_name='demo',
data=['whats the focus of information retrieval?'],
anns_field='sparse',
limit=3,
search_params=search_params
)
4、混合搜索
混合搜索指的是一种同时进行多个 ANN 搜索、对这些 ANN 搜索的多组结果进行 Rerankers 并最终返回一组结果的搜索方法。使用混合搜索可以提高搜索精度。混合搜索最常用于稀疏密集向量搜索和多模态搜索等场景。
MilvusCollectionHybridSearchRetriever 是使用 Milvus 和 LangChain 进行混合搜索的另一种实现, 即将被弃用 。
应用场景
混合搜索适用于以下两种情况。
稀疏-密集向量搜索
不同类型的向量可以表示不同的信息,使用各种嵌入模型可以更全面地表示数据的不同特征和方面。例如,对同一个句子使用不同的 Embeddings 模型,可以生成表示语义的密集向量和表示句子中词频的稀疏向量。
- 稀疏向量: 稀疏向量的特点是其向量维度高,存在很少的非零值。这种结构使其特别适合传统的信息检索应用。在大多数情况下,稀疏向量中使用的维数对应于一种或多种语言中的不同词块。每个维度都有一个值,表示该标记在文档中的相对重要性。这种布局对于涉及文本匹配的任务非常有利。
- 密集向量: 密集向量是从神经网络中衍生出来的嵌入。当排列成有序数组时,这些向量能捕捉到输入文本的语义本质。需要注意的是,稠密向量并不局限于文本处理;它们还广泛应用于计算机视觉,以表示视觉数据的语义。这些稠密向量通常由文本 Embeddings 模型生成,其特点是大部分或所有元素都非零。因此,密集向量对于语义搜索应用特别有效,因为即使在没有精确文本匹配的情况下,它们也能根据向量距离返回最相似的结果。这种功能可以获得更细致入微、更能感知上下文的搜索结果,通常可以捕捉到基于关键词的方法可能忽略的概念之间的关系。
多模式搜索
多模态搜索是指跨多种模态(如图像、视频、音频、文本等)对非结构化数据进行相似性搜索。例如,一个人可以用指纹、声纹和面部特征等多种数据模式来表示。混合搜索支持同时进行多种搜索。例如,用相似的指纹和声纹搜索一个人。
工作流程
混合搜索的主要工作流程如下。

5、重新排名
下图展示了在 Milvus 中执行混合搜索的过程,并强调了重排在此过程中的作用。

混合搜索中的重新排序是一个关键步骤,它可以整合来自多个向量场的结果,确保最终输出结果具有相关性并能准确排出优先级。目前,Milvus 提供以下重新排序策略:
- WeightedRanker:这种方法通过计算来自不同向量搜索的得分(或向量距离)的加权平均值来合并结果。它根据每个向量场的重要性分配权重。
- RRFRanker:这种策略根据结果在不同向量列中的排名来合并结果。
加权评分(WeightedRanker)
WeightedRanker 策略根据每个向量字段的重要性,为每个向量检索路径的结果分配不同的权重。当每个向量字段的重要性不同时,就会应用这种 Rerankers 策略,这样就可以通过给某些向量字段分配更高的权重,使其比其他向量字段更受重视。例如,在多模态搜索中,文本描述可能比图像中的颜色分布更重要。
互易等级融合(RRFRanker)
RRF 是一种数据融合方法,它根据排名的倒数来组合排名列表。它是一种平衡各向量场影响的有效方法,尤其是在没有明确的重要性优先顺序时。这种策略通常用于想要对所有向量场给予同等考虑,或对每个场的相对重要性存在不确定性时。
RRF 的基本流程如下:
- 在检索过程中收集排名 :检索器跨多个向量字段检索并对结果进行排序。
- 排名融合 :RRF 算法对每个检索器的排名进行权衡和合并。计算公式如下

这里,𝑁 代表不同检索路径的数量,rank𝑖(𝑑) 是第 𝑖 个检索器检索到的文档𝑑 的排名位置,𝑘 是平滑参数,通常设置为 60。
- 综合排名 :根据综合得分对检索结果重新排序,得出最终结果。
RRF 允许在不指定明确权重的情况下平衡各领域的影响。在最终排名中,多个字段一致同意的最匹配结果将被优先排序。
在RRF(Reciprocal Rank Fusion)算法中**,参数 k是平滑因子**,用于控制排名对最终得分的影响程度。以下是 k=60和 k=100的核心区别:

示例说明
假设两路检索结果如下:
- 稠密向量检索 :文档A排名第1,文档B排名第5。
- 稀疏向量检索 :文档A排名第3,文档B排名第1。
k=60的得分计算 :
- 文档A:1/(60+1)+1/(60+3)≈0.032
- 文档B:1/(60+5)+1/(60+1)≈0.034 → 文档B胜出
k=100的得分计算 :
- 文档A:1/(100+1)+1/(100+3)≈0.020
- 文档B:1/(100+5)+1/(100+1)≈0.019 → 文档A胜出
可见,k=60更倾向稀疏向量检索的高排名项(文档B),而 k=100平衡了双方权重。
nprobe=10
功能说明
-
作用场景 :用于Milvus/FAISS等向量数据库的近似最近邻(ANN)搜索,属于IVF(Inverted File)类索引的核心参数。
-
定义 :nprobe控制搜索时访问的聚类中心(桶)数量。例如,若索引有1024个聚类中心(nlist=1024),nprobe=10表示仅搜索距离查询向量最近的10个聚类中心内的向量。
-
影响 :
- 精度 :值越大(如 nprobe=128),搜索范围越广,召回率越高,但计算量增加。
- 性能 :值越小(如 nprobe=1),搜索速度越快,但可能遗漏相关结果。
# 数值比较
# 数值比较 filter = "price < 100" filter = "rating >= 4.5"
# 字符串匹配 filter = "category == '科技'" filter = "author in ['Alice', 'Bob']"
# 逻辑组合 filter = "price < 100 AND category == '科技'" filter = "status == 1 OR is_featured == true"





