Lucene 的优化

索引的优化技术大概有三种:

一、是通过调整mergeFactor、maxMergeDocs和minMergeDocs参数的值来达到索引优化的目的。其中,mergeFactor是控制片段合并的频度和大小,maxMergeDocs是每片段文档数的上限,minMergeDocs是控制索引过程中可用RAM的数量。结合机器的内存情况,合理地配置这三个参数,能达到最优的效果。

二、是组合使用RAMDirectory和FSDirectory。使用以上两者时会发现它们都有各自的长短处,例如,RAMDirectory具有较高的存储速度,但它受到实际内存的限制;FSDirectory不受实际内存的限制,但因为要读写文件,所以速度是它的瓶颈。组合使用RAMDirectory和FSDirectory,能很好地解决速度和内存空间的矛盾问题,从而达到优化目的。具体做法是先把doc存到RAMDirectory里,等到RAMDirectory里doc数量达到某个限度时,再把这些doc一次性地写到FSDirectory里。这里RAMDirctory起到一个缓冲的作用。

三、是使用多索引器。通过使用多线程技术来实现并行程序设计,这样能提高建立索引的速度,但由于技术的复杂性和易错性,所以这种技术要求有很高的编程能力。

检索的优化技术

Lucene 支持内存索引:这样的搜索比基于文件的I/O有数量级的速度提升。而尽可能减少IndexSearcher的创建和对搜索结果的前台的缓存也是必要的。

Lucene 面向全文检索的优化在于首次索引检索后,并不把所有的记录(Document)具体内容读取出来,而起只将所有结果中匹配度最高的头100条结果(TopDocs)的ID放到结果集缓存中并返回,这里可以比较一下数据库检索:如果是一个10,000条的数据库检索结果集,数据库是一定要把所有记录内容都取得以后再开始返回给应用结果集的。所以即使检索匹配总数很多,Lucene的结果集占用的内存空间也不会很多。对于一般的模糊检索应用是用不到这么多的结果的,头100条已经可以满足90%以上的检索需求。

如果首批缓存结果数用完后还要读取更后面的结果时Searcher会再次检索并生成一个上次的搜索缓存数大1倍的缓存,并再重新向后抓取。所以如果构造一个Searcher去查1-120条结果,Searcher其实是进行了2次搜索过程:头100条取完后,缓存结果用完,Searcher重新检索再构造一个200条的结果缓存,依此类推,400条缓存,800条缓存。由于每次Searcher对象消失后,这些缓存也访问那不到了,你有可能想将结果记录缓存下来,缓存数尽量保证在100以下以充分利用首次的结果缓存,不让Lucene浪费多次检索,而且可以分级进行结果缓存。