通过重用文档和字段实例提高Lucene索引性能时出现的问题

时间:2014-07-05 10:09:04

标签: java multithreading performance indexing lucene

有许多可以改善Lucene Indexing的性能,我已经关注了此网站ImproveIndexingSpeed Tips 的许多提示,包括:

  1. 通过覆盖IndexWriter的几种方法将MultiThreads应用于索引  即:addDocument updateDocument,这给我带来了很多性能提升(大约快了7.8倍)。
  2. 重复使用文档和字段实例。根据提示,它说: "最好创建一个Document实例,然后向其添加多个Field实例,但保留这些Field实例并通过更改每个添加文档的值来重复使用它们#34;。
  3. 第一个提示带来了良好的性能提升,但第二个提示没有。

    我创建了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设计不兼容。

    有关“如何实施重用文件和字段”的任何建议。将不胜感激

2 个答案:

答案 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。之后,我们可以重用字段实例。但是,我没有办法知道何时确保该字段已写入索引中。如果你有办法,请告诉我,谢谢你。

为我可怜的英语道歉。