效率:重用术语Lucene 6

时间:2017-03-12 14:06:41

标签: lucene processing-efficiency memory-efficient

我希望每次调用此方法时都重用Term对象而不是创建一个新对象:

public Term(String fld)
Constructs a Term with the given field and empty text. This serves two purposes: 1) reuse of a Term with the same field. 2) pattern for a query.

我在文档中读到,我可以使用Term的这个构造函数来重用它:

import org.optaplanner.persistence.jpa.impl.score.buildin.hardsoft.HardSoftScoreHibernateType;

但是,我不知道下一步是什么,因为Term文档中没有setter,也没有reset()方法。

有关如何实现这一目标的任何提示?

1 个答案:

答案 0 :(得分:0)

构建条款很便宜。你可能不应该过多地担心重用它们。如果您看到真正的性能问题,则应运行探查器。我猜测构造术语不是真正的问题,尝试重用这样的条款只会使事情变得复杂,没有明显的好处。

也就是说,您可以通过从Term.bytes()获取Term的BytesRef并直接修改底层字节数组来重用它。

String text = "text";
Term term = new Term("field");
BytesRef bytes = term.bytes();
bytes.bytes = new byte[UnicodeUtil.maxUTF8Length(text.length())];
bytes.length = UnicodeUtil.UTF16toUTF8(text, 0, text.length(), bytes.bytes);

请注意,您不能更改仍在使用的Term的值。例如,尝试向这样的BooleanQuery添加两个子句当然不起作用。