1. 正倒排索引的结构
1.1 正排索引
正排索引存储文档内容及其 ID。
// 定义文档信息结构体
typedef struct DocInfo {
std::string title; // 文档标题
std::string content; // 文档内容
std::string url; // 文档 URL
int doc_id; // 文档 ID
} DocInfo;
1.2 倒排索引
倒排索引存储文档 ID、对应关键字及权重。InvertedList 通常称为倒排拉链,一个关键字可能对应多个文档。
// 定义倒排元素结构体
struct InvertedElem {
int doc_id; // 文档 ID
std::string word;// 关键词
int weight; // 权重
};
typedef std::vector<InvertedElem> InvertedList;
2. 正倒排序部分 Class 的 Private 部分
2.1 准备工作
正向索引使用 Vector,下标即为文档 ID,便于访问。反向索引使用哈希表(unordered_map),将关键字映射到倒排文档列表。
private:
// 正排索引使用 Vector,下标对应文档 ID
std::vector<DocInfo> forward_index;
// 使用哈希表进行映射
std::unordered_map<std::string, InvertedList> inverted_index;
2.2 单例模式
本代码采用单例模式,主要优势包括:
- 减少资源浪费:避免反复创建或销毁实例导致的内存占用过高和 IO 开销增加。
- 确保全局逻辑统一:强制所有搜索请求复用同一套逻辑,避免结果混乱。
- 简化资源管理与调用:降低模块间耦合度,减少代码冗余。
因此需禁用拷贝构造函数和赋值运算符,并添加互斥锁以防止多线程并发创建实例。双重检查锁定机制用于确保线程安全。
private:
Index() {};
Index(const Index&) = delete;
Index& operator=( Index&) = ;
Index* instance;
std::mutex log;
:
~();
{
(instance == ) {
log.();
(instance == ) {
instance = ();
}
log.();
}
instance;
}


