繁体   English   中英

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

[英]problems when Improve Lucene Index Performance by reuse Document and Field Instance

有许多改进Lucene Indexing性能的方法,我已经遵循了该网站的许多技巧ModifyIndexingSpeed Tips ,包括:

  1. 通过重写IndexWriter的几种方法(即addDocument updateDocument在索引中应用多addDocument updateDocument ,这为我带来了很多性能改进(快约addDocument updateDocument倍)。
  2. 重用Document和Field实例。 根据提示,它说:“最好创建一个Document实例,然后向其中添加多个Field实例,但是要保留这些Field实例,并通过更改每个添加的文档的值来重新使用它们”。

第一个技巧带来了良好的性能改进,而第二个技巧则没有。

我将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM