问题描述
Zvec 的 Doc ID 校验规则不透明。当插入文档时,某些字符会导致 \Invalid doc: doc[...] contains invalid characters\ 错误,但:
文档没有说明哪些字符是允许的
错误信息没有指出具体哪个字符非法
校验规则对 Windows 路径不友好(无法使用文件路径作为 ID)
复现
\\python
import zvec, os, tempfile, shutil
tmp = tempfile.mkdtemp()
shutil.rmtree(tmp)
schema = zvec.CollectionSchema(
name='test',
fields=[zvec.FieldSchema(name='x', data_type=zvec.DataType.INT64)],
vectors=[zvec.VectorSchema(name='v', data_type=zvec.DataType.VECTOR_FP32, dimension=2,
index_param=zvec.HnswIndexParam(metric_type=zvec.MetricType.COSINE, m=16, ef_construction=200))]
)
col = zvec.create_and_open(tmp, schema)
这些 ID 可以成功
for id in ['hello', 'hello-world', 'hello_world', 'hello.world', 'file.txt', 'C_path', '123']:
col.insert(zvec.Doc(id=id, vectors={'v': [1.0, 0.0]}, fields={'x': 1}))
print(f' OK: {id!r}')
这些 ID 会失败
for id in ['a/b', 'a:b']:
try:
col.insert(zvec.Doc(id=id, vectors={'v': [1.0, 0.0]}, fields={'x': 1}))
except Exception as e:
print(f' FAIL: {id!r} -> {e}')
shutil.rmtree(tmp)
\\
输出:
\
OK: 'hello'
OK: 'hello-world'
OK: 'hello_world'
OK: 'hello.world'
OK: 'file.txt'
OK: 'C_path'
OK: '123'
FAIL: 'a/b' -> Invalid doc: doc[a/b] contains invalid characters
FAIL: 'a:b' -> Invalid doc: doc[a:b] contains invalid characters
\\
影响
用户尝试用文件路径做 ID 时会莫名其妙失败
调试困难:错误信息只说 \contains invalid characters\,没有指出哪些字符
与 Issue [Enhance]: Relax collection, field, and document ID name validation #395 (Relax ID validation)相关,但 [Enhance]: Relax collection, field, and document ID name validation #395 关注的是放宽限制,而这里的问题是校验规则不透明
建议
在文档中明确列出 ID 允许的字符集
改进错误信息,指出具体是哪些字符非法
(可选)放宽 ID 限制,允许更多字符(如 / 和 :)
环境
Zvec v0.5.1(pip 安装)
Windows 10 x64
Python 3.11
问题描述
Zvec 的 Doc ID 校验规则不透明。当插入文档时,某些字符会导致 \Invalid doc: doc[...] contains invalid characters\ 错误,但:
复现
\\python
import zvec, os, tempfile, shutil
tmp = tempfile.mkdtemp()
shutil.rmtree(tmp)
schema = zvec.CollectionSchema(
name='test',
fields=[zvec.FieldSchema(name='x', data_type=zvec.DataType.INT64)],
vectors=[zvec.VectorSchema(name='v', data_type=zvec.DataType.VECTOR_FP32, dimension=2,
index_param=zvec.HnswIndexParam(metric_type=zvec.MetricType.COSINE, m=16, ef_construction=200))]
)
col = zvec.create_and_open(tmp, schema)
这些 ID 可以成功
for id in ['hello', 'hello-world', 'hello_world', 'hello.world', 'file.txt', 'C_path', '123']:
col.insert(zvec.Doc(id=id, vectors={'v': [1.0, 0.0]}, fields={'x': 1}))
print(f' OK: {id!r}')
这些 ID 会失败
for id in ['a/b', 'a:b']:
try:
col.insert(zvec.Doc(id=id, vectors={'v': [1.0, 0.0]}, fields={'x': 1}))
except Exception as e:
print(f' FAIL: {id!r} -> {e}')
shutil.rmtree(tmp)
\\
输出:
\
OK: 'hello'
OK: 'hello-world'
OK: 'hello_world'
OK: 'hello.world'
OK: 'file.txt'
OK: 'C_path'
OK: '123'
FAIL: 'a/b' -> Invalid doc: doc[a/b] contains invalid characters
FAIL: 'a:b' -> Invalid doc: doc[a:b] contains invalid characters
\\
影响
建议
环境