1. 设计
@ 索引创建
采用【动态索引】的策略,可以实现实时搜索的功能;
动态索引的实现需要“倒排索引”,“临时索引”和“已删除文档列表”,其中“倒排索引”存储在磁盘文件中,“临时索引”存储在内存中;
思路:
当系统发现有新文档进入时,立即将其加入临时索引中;有文档被删除时,则将其加入删除文档队列;文档被更改时,则将原先文档放在删除队列,解析更新后的文档内容,并将其加入临时索引中;
用户输入查询请求时,搜索引擎同时从倒排索引和临时索引中读取结果,并将两个结果进行合并,之后用删除文档列表进行过滤,形成最终的搜索结果;
@ 索引更新
【完全重建策略】:考虑到企业内搜索的数据量不像互联网数据那么多,所以采用此种策略;
当新增文档达到一定数量后,将新增文档和原先的老文档进行合并,重新建立倒排索引至磁盘中;新索引建立完成后,老的索引被遗弃释放;
@ 索引更新与后期搜索功能的整合
更新索引的线程同时更新server.conf配置文件,文件中记录当前正在使用的是哪一个磁盘数据库;
网页搜索的时候根据server.conf中的index信息以只读的方式打开对应的数据库;
为了防止打开获取磁盘索引地址后,临时索引立刻重置的情况发生,可以在更新倒排索引的线程中进行如下处理:server.conf中的文件变更后,暂停1s再重置临时索引,这样可以保证搜索程序可以获取到旧临时索引的内容;
@ 临时索引中添加新文档以及提供给其他程序的接口
搜索引擎临时索引与其他程序的数据依靠mysql数据库传送;
当其他程序有文档导入检索系统中时,首先解析文档提取出Xapian::Document中的value,data和term,将这些数据写入mysql数据库中;
当搜索引擎中更新索引的线程检测到mysql中有数据时,将根据这些数据生成Xapian::Document,并加入临时索引中;
最后将mysql中的内容存为文档,方便重建索引,并删除数据库中的该条数据;
2. 实战
采用Xapian进行索引的创建工作(Xapian实战(三)-索引);
以下为UML图 -
类设计:
IndexCreater - 生成索引的接口;
Doc - 为每个文档生成Xapian::Document;
FileParser - 解析文档,提取Xapian::Document需要的元素;
3. 测评
@ 时间
解析文档 + 生成索引:9109个文件,共耗时12min(大部分为解析文档的时间);
此处有优化空间:
服务器第一次启动时需要对每个文档都解析一遍,并生成新文档.lib(包含value,term,data)方便后续更快生成Xapian::Document;
后续每次系统添加新文档时才需要解析文档;
当临时索引达到大小上限时,只需根据已有的.lib生成Xapian::Document,再建立新索引即可;
@ 空间
索引文件大小:9109个文件 229M
问题:
此数据在业界是什么水平?
若要优化,是否是进行索引压缩?