為了提高索引速度壕鹉,可以重用Field担扑,而不是每次都創(chuàng)建新的雏赦。從Lucene2.3開始劫笙,有新的setValue方法,可以改變一個Field的值星岗。這樣可以在增加許多Document的時候重用單個Field實例填大,節(jié)省許多GC消耗的時間。
之前從對數(shù)據(jù)庫的數(shù)據(jù)創(chuàng)建索引時候代碼如下:
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"));
}
索引的結(jié)果如下:
重用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"));
}
得到的結(jié)果如下:
可以發(fā)現(xiàn)得到的結(jié)果是一樣的俏橘,但是重用Field可以減少創(chuàng)建Field的對象允华,節(jié)省GC消耗的時間,在需要索引的文件數(shù)目多的時候效果應(yīng)該更明顯寥掐。
注意靴寂,不能再一個文檔中重用單個Field實例,不應(yīng)該改變一個列的值召耘,直到包含這個Field的Document已經(jīng)加入索引庫百炬。