我正在尝试实现一个lucene过滤器来删除查询中某个词的前缀。看起来在多次查询之后,过滤器被重用,所以char缓冲区是脏的。
下面的代码是简化的,前缀是一个外部参数。
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());
但我不知道这是不是对的。有人能帮我吗?
- 谢谢-谢谢
1条答案
按热度按时间ki0zmccv1#
看看这对你有没有帮助,
https://github.com/jprante/elasticsearch-plugin-bundle/blob/f63690f877cc7f50360faffbac827622c9d404ef/src/main/java/org/xbib/elasticsearch/plugin/bundle/index/analysis/standardnumber/StandardnumberTokenFilter.java