美文网首页
重用Field

重用Field

作者: 尚亦汐 | 来源:发表于2016-07-27 15:07 被阅读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已经加入索引库。

    相关文章

      网友评论

          本文标题:重用Field

          本文链接:https://www.haomeiwen.com/subject/dpmojttx.html