有许多可以改善Lucene Indexing的性能,我已经关注了此网站ImproveIndexingSpeed Tips 的许多提示,包括:
addDocument updateDocument
,这给我带来了很多性能提升(大约快了7.8倍)。第一个提示带来了良好的性能提升,但第二个提示没有。
我创建了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
实例,并阻止其他线程添加动作。
我的问题是:
&#34>有什么问题?重用"部分? (我认为我的实施肯定有问题,因为文档没有提到重用文档和字段与MultiThreads设计不兼容。
有关“如何实施重用文件和字段”的任何建议。将不胜感激
答案 0 :(得分:2)
您不需要在每次迭代时将字段添加到doc。您可以只在循环中添加一次,并在循环中使用“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);
}
答案 1 :(得分:1)
恩,我看过ImproveIndexingSpeed Tips ,提示“重用文档和字段实例”有一个注释:
“请注意,您不能在文档中重复使用单个Field实例,并且,在将包含该字段的文档添加到索引之前,不应更改字段的值。有关详细信息,请参阅字段。“
所以,我认为你应该确保在索引中写入了Fields。之后,我们可以重用字段实例。但是,我没有办法知道何时确保该字段已写入索引中。如果你有办法,请告诉我,谢谢你。
为我可怜的英语道歉。