首先,正排索引与倒排索引在搜索引擎项目中至关重要。正排索引将文档内容映射到文档 ID,倒排索引则根据关键词映射到文档 ID。搜索引擎在处理文档时,先创建正排索引,再基于其生成倒排索引。当用户查询时,利用倒排索引快速定位文档,结合正排索引展示结果。
1. 正倒排索引的结构
1.1 正排索引
正排索引存储文档内容及对应 ID。
// 正排索引结构体
typedef struct DocInfo {
std::string title; // 文档标题
std::string content; // 文档内容
std::string url; // 文档 URL
int doc_id; // 文档 ID
} DocInfo1;
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:
// 正排索引
std::vector<DocInfo1> forward_index;
// 倒排索引
std::unordered_map<std::string, InvertedList> inverted_index;
2.2 单例模式
采用单例模式管理索引实例,减少资源浪费,确保全局逻辑统一,简化资源管理。需禁用拷贝构造函数和赋值运算符,并使用互斥锁防止多线程并发创建多实例。
private:
Index() {};
Index(const Index&) = delete;
Index& operator=(const Index&) = delete;
static Index* instance;
std::mutex log;
:
~();
{
(instance == ) {
log.();
(instance == ) {
instance = ();
}
log.();
}
instance;
}


