我一直在尝试在Lucene中实现自定义分析器。我想我真的很接近完成,但我面临两个奇怪的问题。
首先,我的过滤器按照预期为令牌流中的每个术语工作,但最后一个除外。 (虽然我正在尝试处理它)。
其次,使用TokenFilter(即使错过最后一个术语)也不会有问题。但是虽然索引工作正常(用Luke检查结果索引),当我尝试使用我的分析器解析用户查询时=结果查询是空白的(!)这可能是由于缺少的术语吗?
我在下面发布了过滤器的incrementToken()方法。任何帮助都会非常受欢迎。先感谢您。
P.S。我现在在贡献方面这个问题并不好,但我找不到其他地方的具体内容。
public boolean incrementToken() throws IOException {
if (!input.incrementToken()) {
if (previousTokenFlag) {
tempPreviousToken.attSource.copyTo(this);
previousTokenFlag = false;
this.incrementToken();
return false;
} else {
return false;
}
}
if (previousTokenFlag) {
if (CheckIfMainName(this.termAtt.term())) {
if (CheckIfMainName(tempPreviousToken.termAtt.term())) {
termAtt.setTermBuffer(tempPreviousToken.termAtt.term() +
TOKEN_SEPARATOR + this.termAtt.term());
this.setPreviousTokenFlag(false);
return true;
} else {
tempHelpingToken = new TempToken(this.input.cloneAttributes());
}
tempPreviousToken.attSource.copyTo(this);
tempHelpingToken.attSource.copyTo(tempPreviousToken.attSource);
return true;
} else {
if (CheckIfMainName(tempPreviousToken.termAtt.term())) {
tempHelpingToken = new TempToken(this.input.cloneAttributes());
tempPreviousToken.attSource.copyTo(this);
tempHelpingToken.attSource.copyTo(tempPreviousToken.attSource);
tempHelpingToken.attSource.clearAttributes();
return true;
} else {
tempHelpingToken = new TempToken(this.input.cloneAttributes());
tempPreviousToken.attSource.copyTo(this);
tempHelpingToken.attSource.copyTo(tempPreviousToken.attSource);
tempHelpingToken.attSource.clearAttributes();
return true;
}
}
} else {
tempPreviousToken = new TempToken(this.input.cloneAttributes());
tempPreviousToken.termAtt.setTermBuffer(this.termAtt.term());
this.setPreviousTokenFlag(true);
this.incrementToken();
return true;
}
}
答案 0 :(得分:0)
我不确定你要做什么,但你过滤的第一行看起来不对:
tempPreviousToken.attSource.copyTo(this);
previousTokenFlag = false;
this.incrementToken();
return false;
首先,将 tempPreviousToken 复制到当前令牌(tempPreviousToken.attSource.copyTo(this)
),然后始终返回false,从而无法使用当前令牌。您应该直接返回false,或者根据您尝试复制的令牌返回true / false。