zoukankan      html  css  js  c++  java
  • 企业内搜索引擎项目(二):索引的设计和创建

    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

    问题:

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

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

  • 相关阅读:
    纯javascript遮罩层原理
    artDIalog 弹出层
    键盘对应ASCII码
    SQL Prompt 4安装步骤
    VSS2008 安装silverlight3.0步骤
    Jquery循环显示图片
    借助一般处理程序做验证码
    Socket编程原理及属性
    完整的HttpRequest讲解 createXmlHttpRequest Ajax请求
    年月日三级菜单 jquery
  • 原文地址:https://www.cnblogs.com/tanfy/p/5730335.html
Copyright © 2011-2022 走看看