[英]problems when Improve Lucene Index Performance by reuse Document and Field Instance
有許多改進Lucene Indexing性能的方法,我已經遵循了該網站的許多技巧ModifyIndexingSpeed Tips ,包括:
addDocument updateDocument
在索引中應用多addDocument updateDocument
,這為我帶來了很多性能改進(快約addDocument updateDocument
倍)。 第一個技巧帶來了良好的性能改進,而第二個技巧則沒有。
我將Document ,Field
設為Document ,Field
靜態實例,因此不會每次都實例化它(節省了創建開銷和資源)。
private static Document doc = new Document();
private static Field uinField = new StringField("uin", "", Store.YES);
private static Field nameField = new StringField("name", "", Store.YES);
private static Field urlField = new StringField("url", "", Store.YES);
private static Field servField = new TextField("services", "", Store.YES);
使用Field
setValue
方法更改其中的值,然后將其添加到doc
實例中。
uinField.setStringValue(String.valueOf(p.getUin()));
nameField.setStringValue(p.getName());
urlField.setStringValue(p.getUrl());
servField.setStringValue(p.getService());
doc.add(uinField);
doc.add(nameField);
doc.add(urlField);
doc.add(servField);
在運行索引之后,該過程陷入了無限循環。 我猜這是由於MultiThread的副作用,它鎖定了Document and Field
實例,並阻止了其他線程添加addDcoument。
我的問題是:
“重用”部分有什么問題? (我認為我的實現一定有問題,因為文檔沒有提到“重用文檔和字段”將與MultiThreads設計不兼容。
任何有關“如何實現重用文檔和字段”的建議將不勝感激
您不需要每次迭代都將字段添加到文檔中。 您只需在循環外添加一次,然后在循環中使用“ field.setValue writer.addDocument”即可。 就像這樣一個:
Document doc = new Document();
Field field1 = new TextField("field1", field1Value, Field.Store.YES);
doc.add(field1);
Field field2 = new StringField("field2", field2Value,Field.Store.YES);
doc.add(field2);
while ((line = br.readLine()) != null) {
field1.setStringValue("field1Value");
field2.setStringValue("field2Value");
writer.addDocument(doc);
}
ZH ,我已經看到了ModifyIndexingSpeed技巧 ,技巧“重用文檔和字段實例”中有一個注釋:
“請注意,您不能在文檔中重復使用單個Field實例,並且,除非包含該字段的Document被添加到索引中,否則您不應該更改Field的值。有關詳細信息,請參見Field。”
因此,我認為您應該確保字段已寫入索引中。 之后,我們可以重用該字段實例。 但是,我沒有辦法知道何時確保該字段已寫入索引中。 如果您有辦法,請告訴我,謝謝。
抱歉我的英語不好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.