【发布时间】:2021-12-28 06:52:12
【问题描述】:
我正在尝试实现一个 lucene 过滤器以从查询中的术语中删除前缀。 似乎在多次查询后的某个时候,过滤器已被重用,因此 char 缓冲区是脏的。
下面的代码是简化的,prefix是一个外部参数。
public static class PrefixFilter extends TokenFilter {
private final PackedTokenAttributeImpl termAtt = (PackedTokenAttributeImpl) addAttribute(CharTermAttribute.class);
public PrefixFilter(TokenStream in) {
super(in);
}
@Override
public final boolean incrementToken() throws IOException {
if (!input.incrementToken()) {
return false;
}
String value = new String(termAtt.buffer());
value = value.trim();
value = value.toLowerCase();
value = StringUtils.removeStart(value, "prefix_");
if (value.isBlank()) {
termAtt.setEmpty();
} else {
termAtt.copyBuffer(value.toCharArray(), 0, value.length());
termAtt.setLength(value.length());
}
return true;
}
}
所以在 10 或 12 次查询之后,值“prefix_a”变成了“abcde”。
所以我正在尝试以这种方式添加 termBuffer 偏移结束值:
termAtt.setEmpty();
termAtt.resizeBuffer(value.length());
termAtt.copyBuffer(value.toCharArray(), 0, value.length());
termAtt.setLength(value.length());
termAtt.setOffset(0, value.length());
但我不知道它是否正确。谁能帮帮我?
谢谢。
【问题讨论】: