简单构建高并发
This commit is contained in:
68
app/milvus_helpers.py
Normal file
68
app/milvus_helpers.py
Normal file
@ -0,0 +1,68 @@
|
||||
|
||||
from pymilvus import connections, utility, Collection, CollectionSchema, FieldSchema, DataType
|
||||
from .config import settings
|
||||
|
||||
# 定义集合名称和相关参数
|
||||
COLLECTION_NAME = "face_features_collection"
|
||||
FACE_VECTOR_DIM = 512 # InsightFace 'buffalo_l' 模型的特征维度
|
||||
|
||||
class MilvusHelper:
|
||||
def __init__(self):
|
||||
try:
|
||||
# 连接 Milvus 服务
|
||||
connections.connect("default", host=settings.MILVUS_HOST, port=settings.MILVUS_PORT)
|
||||
print("成功连接到 Milvus 服务。")
|
||||
except Exception as e:
|
||||
print(f"连接 Milvus 服务失败: {e}")
|
||||
raise
|
||||
|
||||
def has_collection(self):
|
||||
"""检查集合是否存在"""
|
||||
return utility.has_collection(COLLECTION_NAME)
|
||||
|
||||
def create_collection(self):
|
||||
"""创建一个新的集合来存储人脸特征"""
|
||||
if self.has_collection():
|
||||
print(f"集合 '{COLLECTION_NAME}' 已存在。")
|
||||
return
|
||||
|
||||
# 定义字段
|
||||
# 主键字段,Milvus 会自动生成ID
|
||||
pk_field = FieldSchema(name="feature_id", dtype=DataType.INT64, is_primary=True, auto_id=True)
|
||||
# 对应的用户ID字段
|
||||
user_id_field = FieldSchema(name="user_id", dtype=DataType.INT64)
|
||||
# 人脸特征向量字段
|
||||
embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=FACE_VECTOR_DIM)
|
||||
|
||||
# 创建集合 Schema
|
||||
schema = CollectionSchema(
|
||||
fields=[pk_field, user_id_field, embedding_field],
|
||||
description="人脸识别特征集合",
|
||||
enable_dynamic_field=False
|
||||
)
|
||||
|
||||
# 创建集合
|
||||
self.collection = Collection(name=COLLECTION_NAME, schema=schema)
|
||||
print(f"集合 '{COLLECTION_NAME}' 创建成功。")
|
||||
|
||||
# 为向量字段创建索引以加速搜索
|
||||
index_params = {
|
||||
"metric_type": "IP", # IP (Inner Product) 等价于归一化向量的余弦相似度
|
||||
"index_type": "IVF_FLAT",
|
||||
"params": {"nlist": 1024} # nlist 的值需要根据数据量调整
|
||||
}
|
||||
self.collection.create_index(field_name="embedding", index_params=index_params)
|
||||
print("向量索引创建成功。")
|
||||
return self.collection
|
||||
|
||||
def get_collection(self):
|
||||
"""获取集合对象并加载到内存中以便搜索"""
|
||||
if not self.has_collection():
|
||||
self.create_collection()
|
||||
collection = Collection(COLLECTION_NAME)
|
||||
collection.load()
|
||||
return collection
|
||||
|
||||
# 在模块加载时创建一个全局实例
|
||||
milvus_client = MilvusHelper()
|
||||
collection = milvus_client.get_collection()
|
Reference in New Issue
Block a user