企业内搜索引擎项目(二):索引的设计和创建

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

问题:

此数据在业界是什么水平?

若要优化,是否是进行索引压缩?

posted on 2016-08-19 20:03  tanfy  阅读(393)  评论(0编辑  收藏  举报

导航