日期:2014-05-20  浏览次数:20675 次

Lucene 3.4 索引速度为什么没有2.3快
如题,建立索引时感觉3.4比2.3慢了好多,然后写了一段简单的代码试了一下。2.3需要641ms,而3.4却用了1563ms,不可思议啊,按理说3.4比2.3快好多才对吧..不知道问题出哪儿了,求解答~~
Java code

//2.3的代码
    public static void main(String args[]) throws Exception{
        long a=System.currentTimeMillis();
        IndexWriter writer=new IndexWriter("index", new KeywordAnalyzer(),true);
        writer.setMergeFactor(1024);
        Document doc=null;
        for(int i=0;i<50000;i++){
            doc=new Document();
            doc.add(new Field("id","wo"+i,Field.Store.YES,Field.Index.TOKENIZED));
            doc.add(new Field("lon","123.1111",Field.Store.YES,Field.Index.TOKENIZED));
            writer.addDocument(doc);
        }
        writer.optimize();
        writer.close();
        long b=System.currentTimeMillis();
        System.out.println("time:"+(b-a)+"ms");
    }




Java code

//3.4代码
    public static void main(String args[]) throws Exception{
        long a=System.currentTimeMillis();
        Directory dir=FSDirectory.open(new File("index"));
        IndexWriterConfig conf=new IndexWriterConfig(Version.LUCENE_34, new KeywordAnalyzer());
        conf.setOpenMode(OpenMode.CREATE);
        LogByteSizeMergePolicy mp=new LogByteSizeMergePolicy();
        mp.setMergeFactor(1024);
        conf.setMergePolicy(mp);
        IndexWriter writer=new IndexWriter(dir, conf);
        Document doc=null;
        for(int i=0;i<50000;i++){
            doc=new Document();
            doc.add(new Field("id","wo"+i,Field.Store.YES,Field.Index.ANALYZED));
            doc.add(new NumericField("lon",Field.Store.YES, true).setDoubleValue(123.1111));
            writer.addDocument(doc);
        }
        writer.optimize();
        writer.close();
        long b=System.currentTimeMillis();
        System.out.println("time:"+(b-a)+"ms");
    }



------解决方案--------------------
Lucene3为了更加方便和有针对性,把对IndexWriter配置操作,单独放置到IndexWriterConfig类中来完成,这是一个的独立的类,把原Lucene2中通过构造函数来实现配置的操作,独立出来,单独设置了一个类即IndexWriterConfig来实现。从实际开发角度来讲,是方便了程序的开发,并且代码的组织会更加明晰和合理。
当然,代价就是需要额外的时间。
这和定义了许多类,这些类存放在不同的包下,和我把所有的操作放在同一个包中的同一个类中来完成是一样的。定义在不同的包中,显然便于维护,代码的组织也比较合理,可读性比较高(尤其代码达到几千、几万行的时候),但从编译到执行所需要的时间肯定要比单个类中定义执行所花费的时间要长。