有两个疑问:
按照代码的逻辑是:如果存在多个向量字段,字段名相同,那么这些向量对应的raw_vector对象内就需要一个VIDMgr对象;
std::vector vid2docid_; // vector id to doc id,数组下标指vectorId,对应的值指docId
std::vector<int *> docid2vid_; // doc id to vector id list,一个doc_id,可以对应多个向量????
为甚么会存在一个docid对应多个vectorId这种情况呢?
第二在Add方法中
int Add(int vid, int docid)
{
// add to vid2docid_ and docid2vid_
if (multi_vids_)
{
vid2docid_[vid] = docid;
if (docid2vid_[docid] == nullptr)
{
docid2vid_[docid] = utils::NewArray(MAX_VECTOR_NUM_PER_DOC + 1, "init_vid_list");
// total_mem_bytes += (MAX_VECTOR_NUM_PER_DOC + 1) * sizeof(int);
docid2vid_[docid][0] = 1; // 第一个位置设为1表示 这个doc下面有1一个向量
docid2vid_[docid][1] = vid; // 第二个位置才开始设置vectorId
}
else
{
int *vid_list = docid2vid_[docid];
// 一个表格最多有10个字段为向量而且还同名
if (vid_list[0] + 1 > MAX_VECTOR_NUM_PER_DOC)
{
return -1;
}
vid_list[vid_list[0]] = vid; // 这个有点不对吧?vid_list[vid_list[0]+1]=vid,在数组的下个位置记下vectorId
vid_list[0]++; // 这个doc有的向量数据+1
}
}
return 0;
}
当docid2vid_[docid] != nullptr时,vectorI的写入的位置是否有误,谢谢
最开始设计VIDMgr主要是支持一个字段插入多个向量的情况,但目前来看,这个需求使用场景极少,可以不用太关注