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