自己动手写分布式搜索引擎
上QQ阅读APP看书,第一时间看更新

3.2.7 索引的优化与合并

在完成了创建最终倒排文件和词典后,全部倒排索引文件的创建工作完毕。从某种角度上看,这些都是一种预先计算(PreComputation)。这种预先计算都是为了节省查询时间,对海量数据完成一次最终倒排索引文件的制作是非常耗时的,这些尽可能预先完成的计算为查询争取了宝贵时间。优化索引很耗时,但索引优化后,查询速度快。

在优化索引阶段,大约需要索引大小2倍的临时空间。因此需要大约400GB的硬盘来容纳200GB的索引。

索引很多文档的过程通常比较慢。为了加快索引速度,可以多台机器同时索引不同内容,然后合并。要合并的几个不同的索引结构要一致。下面的程序可以把多个目录下的索引合并到一个目录下。

        IndexWriter writer = new IndexWriter(args[0], null, true);
        writer.setMergeFactor(50); //参数越大,用到的内存越多。影响内存的使用
        //影响索引文件的数量
        writer.setUseCompoundFile(false);
        Directory[] dirs = new Directory[args.length -1];
        System.out.println("begin :"+args[0]);
        for (int i=1 ; i<args.length; i++)   {
                    dirs[i-1]= FSDirectory.getDirectory( args[i], false);
                    if (dirs[i-1]==null)
                        System.out.println("Directory is null:"+i);
        }
        writer.addIndexes(dirs);
        writer.close();