C++ 基于正倒排索引的 Boost 搜索引擎实现与详解
正排索引与倒排索引协同工作,实现内容搜索。搜索引擎在对文档进行处理和索引构建时,会先创建正排索引,然后基于正排索引进一步生成倒排索引。当用户输入查询关键词时,搜索引擎会利用倒排索引快速定位包含该关键词的文档,再结合正排索引等其他信息进行结果展示。
说明:正排索引将文档内容映射到文档 ID,倒排索引根据文档 ID 映射关键词。两者均为预先创建,非搜索时临时生成。
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 准备工作
正排索引使用 std::vector,下标即为文档 ID,方便访问。倒排索引使用哈希表(unordered_map),实现关键字到倒排文档列表的映射。
private:
// 正排索引使用 vector,下标即文档 ID
std::vector<DocInfo> forward_index;
// 使用哈希进行映射
std::unordered_map<std::string, InvertedList> inverted_index;
2.2 单例模式
采用单例模式管理索引组件,确保全局逻辑统一并减少资源浪费。需禁用拷贝构造函数和赋值运算符,并使用互斥锁防止多线程并发创建实例。
private:
Index() {};
Index(const Index&) = delete;
Index& =( Index&) = ;
Index* instance;
std::mutex log;
:
~();
{
(instance == ) {
log.();
(instance == ) {
instance = ();
}
log.();
}
instance;
}


