重用Field

2016-07-27  本文已影响0人  尚亦汐

为了提高索引速度,可以重用Field,而不是每次都创建新的。从Lucene2.3开始,有新的setValue方法,可以改变一个Field的值。这样可以在增加许多Document的时候重用单个Field实例,节省许多GC消耗的时间。
  之前从对数据库的数据创建索引时候代码如下:

while (rs.next()) {
            Document document = new Document();
            Field field = null;
            if (rs.getString("title") != null) {
                field = new TextField("title", rs.getString("title"), Field.Store.YES);
                document.add(field);
            }
            if (rs.getString("content") != null) {
                field = new TextField("content", rs.getString("content"), Field.Store.NO);
                document.add(field);
            }
            if (rs.getString("url") != null) {
                field = new StringField("url", rs.getString("url"), Field.Store.YES);
                document.add(field);
            }
            if (rs.getString("author") != null) {
                field = new TextField("author", rs.getString("author"), Field.Store.YES);
                document.add(field);
            }
            writer.addDocument(document);
            System.out.println("adding: " + rs.getString("title") + "\t" + rs.getString("url"));
        }

索引的结果如下:

重用field:

        Field titleField=new TextField("title", "title",Field.Store.YES);
        Field contentField
                =new TextField("content", "content",Field.Store.NO);
        Field urlField=new StringField("url","url", Field.Store.YES);
        Field authorField
                =new TextField("author", "author",Field.Store.YES);
        
        while (rs.next()) {
            Document document = new Document();
            if (rs.getString("title") != null) {
                titleField.setStringValue(rs.getString("title"));
                document.add(titleField);
            }
            if (rs.getString("content") != null) {
                contentField.setStringValue(rs.getString("content"));
                document.add(contentField);
            }
            if (rs.getString("url") != null) {
                urlField.setStringValue(rs.getString("url"));
                document.add(urlField);
            }
            if (rs.getString("author") != null) {
                authorField.setStringValue(rs.getString("author")); 
                document.add(authorField);
            }
            writer.addDocument(document);
            System.out.println("adding: " + rs.getString("title") + "\t" + rs.getString("url"));
        }

得到的结果如下:

可以发现得到的结果是一样的,但是重用Field可以减少创建Field的对象,节省GC消耗的时间,在需要索引的文件数目多的时候效果应该更明显。
注意,不能再一个文档中重用单个Field实例,不应该改变一个列的值,直到包含这个Field的Document已经加入索引库。

上一篇下一篇

猜你喜欢

热点阅读