今天收到一个在读的大学生的一封邮件,大意是对搜索引擎比较感兴趣,想研究一下我几年前写的seamsearch 的代码。想了解一下用的什么开发环境,数据结构算法用了哪些,等等。我在这里根据回忆列一下:
开发环境:
由于我之前做java比较多,所以用的是eclipse+cdt的方式写的这个软件 操作系统是ubuntu,应该linux系统都能跑 算法数据结构上主要是参考的lucene,但是没有lucene这么复杂。
1.索引文件:
跟lucene差不多,分别有: *.del 被删除文档信息 *.fdt 文档数据信息 *.tii 项字典 *.pro 项词频数据
*.fdi 字段索引信息
seg.fmn 字段描述信息 segments 段信息 以上这些结构基本跟lucene一个思路,如果想了解可以找lucene想关文档了解一下,这里就不细说了。
2.数据压缩:
也是仿照lucene的Vint,Vlong来压缩数据 ,代码具体在https://github.com/luyongfugx/seamSearch/blob/master/seamSearch/store/IndexOutput.cpp
3.搜索原理
其实就是将搜索文字分词,然后去项字典(.tii)文件查找,查找到后根据位置索引信息到.pro文件里面查找都有哪些文章包含这个 词,然后在根据文章号去fdt,fdi,seg.fmn去读取文档数据。这里面lucene本来用了个跳表(skipList)来存储项字典文字,我这里比较偷懒,直接用了个map来存放,查找的时候直接hash查找。不过这样在字典数量多的时候会多占很多内存。
4.结果排序
lucene里面结果排序的分数算法比较复杂,我这里比较简单,就是各个字典命中的数的总和的排序。 这里的排序用了一个优先级队列来进行多路归并排序。
5.搜索条件
seamSearch只支持and 和 or两种搜索方式,没有lucene那么复杂