因为项目需要,用到了向量数据库Milvus,刚开始都没有遇到问题,直到一个表的主键是字符串(VARCHAR),在查询时刚好要以该主键作为查询条件,此时会出现异常,特此记录一下。
记住,字符串查询,构建表达式时要加上单引号,比如下面的'{face_id}',其实face_id本来就是一个字符串类型了,如果不加会出现如下的异常:
# pymilvus.exceptions.MilvusException: <MilvusException: (code=65535, message=cannot parse expression: face_id == 2_0, error: invalid expression: face_id == 2_0)>
具体看下面的代码(milvus_demo.py),其中exists()函数中构建查询表达式时做了特殊处理:
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility, Partition
import time
from datetime import datetime
from typing import List
#用于测试字符串查询的demo
# MILVUS向量数据库地址
MILVUS_HOST_ONLINE = '127.0.0.1'
MILVUS_PORT = 19530
# 检索时返回的匹配内容条数
VECTOR_SEARCH_TOP_K = 100
class MilvusAvatar:
# table_name 表名
# partition_names 分区名,使用默认即可
def __init__(self, mode, table_name, *, partition_names=["default"], threshold=1.1, client_timeout=3):
self.table_name = table_name
self.partition_names = partition_names
self.host = MILVUS_HOST_ONLINE
self.port = MILVUS_PORT
self.client_timeout = client_timeout
self.threshold = threshold
self.sess: Collection = None
self.partitions: List[Partition] = []
self.top_k = VECTOR_SEARCH_TOP_K
self.search_params = {"metric_type": "L2", "params": {"nprobe": 256}}
self.create_params = {"metric_type": "L2", "index_type": "IVF_FLAT", "params": {"nlist": 2048}}
self.init()
@property
def fields(self):
fields = [
FieldSchema(name='face_id', dtype=DataType.VARCHAR, max_length=640, is_primary=True, auto_id = False),