快速搜索文档神器项目整体框架补充
数据库是核心,之所以快速,是因为我用到了数据库Sqlite3。
将本地的所有文件加载到数据库,通过sql语句来进行文件的搜索
那么如何知道本地文件和数据库的文件是一一对应的,这就需要添加一个扫描模块。先扫描本地的文件,再扫描数据库的文件,进行比对,如果数据库文件少了,则进行插入;如果数据库文件多了,则要进行删除。
而要操作数据库,则需要把数据库进行封装,使代码更有可读性。
但是仅仅封装了数据库是没有意义的,还需要封装一个数据库的数据文件管理类,用来创建数据库和表,并且将文档数据进行增删显示的操作,才能做到数据库文件与本地文件的一一对应关系。也就是说,在宏观上来看,就是操作数据库文件,即对数据库文件进行增删查的操作。而不去显示数据库底层的实现,只调用简单的调用接口,既方便又易懂。
当数据库文件准备好之后,就需要去搜索相关的文件。但是程序仍存在问题,即是实时性问题。当在本地添加一个文件后,需要重新执行程序,去做到本地文件和数据库文件的一一对应,这样的系统是静态的死系统,是不能使用的。同样的道理,如果本地删除了一个文件,而数据库文件中还存在本地该文件,说明它也是静态的死系统。
所以,为了解决实时性问题,需要利用多线程,将整个程序分为两条线,一条是进行本地文件和数据库文件的扫描,另一条线则是进行客户端的搜索,这样就会达到实时性的功能。
为了减少扫描的代价,而不是时时刻刻在进行扫描的工作,太耗时间,需要增加一个监控机制,在有文件有变化的时候去通知扫描线程,再进行扫描,从而提高效率。
而监控模块只针对监控本地文件个数是否有变化,它的效率优于本地文件和数据库文件对比的方式,减少扫描的压力,这就是增加监控机制的意义。而监控模块也需要采用多线程的原理,但是监控模块和扫描模块不能单独地执行,必须有相应的联系,否则监控模块毫无作用
在代码中,扫描模块不需要数据库管理的对象了,因为要分开执行。那么相应的数据库管理模块也需要单独进行,方便客户端的搜索。
搜索分为四种搜索,并且要实现搜索关键字的高亮显示
1.拼音一般搜索
2. 拼音全拼搜索
3.拼音首字母搜索
而界面只需要简单的编排就可以实现。
最后,跟everything相比,这个项目各种功能确实还存在很多不足,所以还有不断学习的空间,everything的源码还是值得我去研究,去用心啃的。