milvus 向量搜索

1. 简介

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

2. 常用语法

  1. 连接milvus
milvus = Milvus(ip, hort)
  1. 创建、删除表,判断表是否存在

当向量数据不断导入时,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)
  1. 向量归一化
    只有当数据做过归一化,Metric_typeL2IP 计算的向量相似度结果才会等价
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
  1. 插入向量

ids只能接受int数据

status, ids = milvus.insert(collection_name=collection_name,
                            records=insert_vectors,
                            ids=ids_list)
  1. TOP-N相似查询

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

你可能感兴趣的:(python)