milvus存储向量化的文本,可以快速查询top-N条相似记录。
milvus安装使用中的一些坑,参考:https://zhuanlan.zhihu.com/p/91444753
在Linux上采用docker安装milvus更简单,参见:https://www.milvus.io/cn/docs/install_milvus.md
需要注意的是,安装gpu版本的milvus需要安装19以上的docker,参考文档:https://blog.csdn.net/weixin_43110668/article/details/122739314
milvus = Milvus(ip, hort)
当向量数据不断导入时,Milvus 会把数据增量式地合并成文件,当某个文件达到 index_file_size 所设置的值之后,该文件就不再接受新的数据,Milvus 会把新的数据存成另外一个文件。
Milvus 在进行搜索时,是依次对每个索引文件进行搜索。当 index_file_size 从1024改为2048时,搜索性能约提升30%~50%。但该值设的过大,有可能导致大文件无法加载进内存。常用的 index_file_size 为1024MB和2048MB。
status, ok = milvus.has_collection(collection_name)
param = {
'collection_name': collection_name, # 表名
'dimension': 200, # 向量维度
'index_file_size': 1024, # 指定数据存储时单个文件的大小
'metric_type': MetricType.IP # optional
}
milvus.create_collection(param)
milvus.drop_collection(collection_name)
Metric_type
的 L2
和 IP
计算的向量相似度结果才会等价def normaliz_data(vec_list):
"""
嵌套列表的数据归一化
:param vec_list:
:return:
"""
for i in range(len(vec_list)):
vec = vec_list[i]
square_sum = reduce(lambda x, y: x + y, map(lambda x: x * x, vec))
sqrt_square_sum = np.sqrt(square_sum)
coef = 1 / sqrt_square_sum
vec = list(map(lambda x: x * coef, vec))
vec_list[i] = vec
return vec_list
ids只能接受int
数据
status, ids = milvus.insert(collection_name=collection_name,
records=insert_vectors,
ids=ids_list)
当N ≤ 20
时,params
参数不用配置
search_param = {"search_length": 100}
status, results = milvus.search(collection_name=collection_name,
query_records=vector_list,
top_k=query_top, params=search_param)
for p, re in enumerate(results[0]):
temp_dict = {}
temp_dict["Id"] = re.id
temp_dict["Similarity"] = re.distance