重用Field

为了提高索引速度,可以重用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已经加入索引库。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,860评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,996评论 25 708
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • 读书最大的好处就是,我不再轻易的给别人贴标签了,是好是坏,有资格有能力评论清楚的人还真不多。多一分体谅,少一...
    天行健君马甲阅读 306评论 0 4
  • 1. 断点设置 本节将继续使用 bugging 程序,首先确认之前有执行过以下命令 建立32位可执行程序编译环境$...
    小虾米不爱吃虾阅读 281评论 0 0