milvus也能像ES一样具有全文检索能力,某些场景下可以使用milvus来实现全文检索,使用场景和代码如何实现请看下文。
基于 Milvus 实现高效全文检索:BM25 算法的落地实践
全文检索是信息检索领域的核心能力,广泛应用于搜索引擎、智能问答、文档匹配等场景。传统的全文检索方案往往需要手动处理文本分词、特征提取和相似度计算,开发成本高且检索效率难以保障。而 Milvus 作为开源的向量数据库,内置了对 BM25 经典全文检索算法的原生支持,能够将文本自动转换为稀疏向量并实现高效检索,大幅降低了全文检索功能的开发门槛。
在实际开发中,我们无需手动实现 BM25 的分词、权重计算等复杂逻辑,只需通过 Milvus 的 Function 机制将 BM25 算法绑定到文本字段,即可在数据写入时自动生成对应的稀疏向量。这种 "文本 - 向量" 的自动转换,不仅简化了开发流程,还能借助 Milvus 的索引优化能力,实现大规模文本数据的快速检索。
以信息检索相关的文本检索场景为例,即使输入的是自然语言问句(如 "whats the focus of information retrieval?"),Milvus 也能基于 BM25 算法计算出与问句最相似的文本内容,并按相似度排序返回结果。整个过程无需手动处理文本特征工程,只需简单配置 Schema 和索引,就能快速搭建起一套高性能的全文检索系统。
相较于传统方案,Milvus 的全文检索方案具备两大核心优势:一是原生支持 BM25 算法,无需集成第三方分词或检索库,技术栈更统一;二是基于向量检索的特性,能够轻松扩展到多模态检索场景(如文本 + 图片检索),具备更强的扩展性。无论是中小规模的文档检索需求,还是大规模的搜索引擎场景,基于 Milvus 的全文检索方案都能兼顾开发效率和检索性能,是全文检索场景的优质选择。
三、总结
- 核心逻辑:通过 Milvus 的 Function 机制绑定 BM25 算法,实现文本到稀疏向量的自动转换,依托向量检索能力完成全文检索。
- 关键配置:需开启文本字段的分词分析器、为稀疏向量字段配置 BM25 类型的索引,确保检索逻辑匹配。
- 优势特点:无需手动实现 BM25 算法细节,自动完成文本特征提取,兼顾开发效率和检索性能,易扩展。
代码部分:
from pymilvus import MilvusClient, DataType, Function, FunctionType
import time
# 1. 初始化Milvus客户端连接
# uri:Milvus服务的访问地址(需替换为实际地址)
# token:认证令牌,格式为"用户名:密码",默认root用户密码为Milvus
client = MilvusClient(
uri="http://192.168.211.128:19530",
token="root:Milvus"
)
# 2. 数据环境准备:清理历史集合(避免重复创建冲突)
# 删除名为"demo"的集合(如果存在)
client.drop_collection(
collection_name="demo"
)
# 3. 定义集合Schema(数据结构)
# 创建空的Schema对象,用于定义集合的字段和函数
schema = client.create_schema()
# 添加主键字段:id,整型64位,自动生成
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)
# 添加文本字段:text,字符串类型,最大长度1000,开启分词分析器(适配全文检索)
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True)
# 添加稀疏向量字段:sparse,用于存储BM25算法生成的文本特征向量
schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)
# 4. 定义BM25函数:实现文本到稀疏向量的自动转换(核心全文检索能力)
bm25_function = Function(
name="text_bm25_emb", # 自定义函数名称,用于标识该BM25转换逻辑
input_field_names=["text"], # 输入字段:待处理的原始文本字段
output_field_names=["sparse"], # 输出字段:存储生成的稀疏向量
function_type=FunctionType.BM25, # 函数类型:BM25(经典全文检索算法)
)
# 将BM25函数绑定到Schema中,实现写入数据时自动生成向量
schema.add_function(bm25_function)
# 5. 定义索引参数:为稀疏向量字段创建索引(提升检索效率)
index_params = client.prepare_index_params()
# 为sparse字段添加索引:
# index_type=AUTOINDEX:Milvus自动选择最优索引类型
# metric_type=BM25:匹配BM25算法的相似度计算方式
index_params.add_index(
field_name="sparse",
index_type="AUTOINDEX",
metric_type="BM25"
)
# 6. 创建集合:整合Schema和索引参数,完成集合初始化
client.create_collection(
collection_name='demo',
schema=schema,
index_params=index_params
)
# 7. 插入测试数据:写入3条与信息检索相关的文本
# 插入时,BM25函数会自动将text字段转换为sparse稀疏向量并存储
client.insert('demo', [
{'text': 'information retrieval is a field of study.'},
{'text': 'information retrieval focuses on finding relevant information in large datasets.'},
{'text': 'data mining and information retrieval overlap in research.'},
])
# 等待数据落盘(Milvus插入后需要时间同步)
time.sleep(1)
# 手动加载集合到内存(确保索引生效)
client.load_collection(collection_name="demo")
# 8. 全文检索查询:基于BM25算法检索相似文本
# 检索参数配置:drop_ratio_search=0.2(检索时的稀疏向量降维比例,平衡效率与精度)
search_params = {
'params': {'drop_ratio_search': 0.2},
}
# 执行检索:
# data:检索问句(自然语言),会自动通过BM25转换为稀疏向量
# anns_field:检索的向量字段(sparse)
# limit:返回Top3最相似结果
# output_fields:返回结果中包含text字段(便于查看匹配文本)
res = client.search(
collection_name='demo',
data=['whats the focus of information retrieval?'],
anns_field='sparse',
limit=3,
search_params=search_params,
output_fields=["text"]
)
# 打印检索结果
print('------------------')
print(res)
# 返回值distance说明:
# 在 Milvus 中,当metric_type="BM25"时,返回的distance并不是传统意义上的 “距离”(越小越近),而是 BM25 的相似度得分(BM25 Score),这是理解数值范围的核心。
#
# BM25 得分的理论范围是:
# 下限:0(表示查询词与文本完全不匹配)
# 上限:无固定最大值(理论上可以无限大,实际中受文本长度、词频、文档集大小影响,通常在0~20之间,值越大相似度越高)
结果输出:
data: ["[{'id': 460393322838430418, 'distance': 1.3352930545806885, 'entity': {'text': 'information retrieval is a field of study.'}}, {'id': 460393322838430419, 'distance': 0.29726022481918335, 'entity': {'text': 'information retrieval focuses on finding relevant information in large datasets.'}}, {'id': 460393322838430420, 'distance': 0.2715056240558624, 'entity': {'text': 'data mining and information retrieval overlap in research.'}}]"]
更多学习资料尽在 老虎网盘资源