Lucene的incrementToken()上一学期被忽略了

时间:2012-02-23 23:03:43

标签: java lucene

我一直在尝试在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;
    }
}

1 个答案:

答案 0 :(得分:0)

我不确定你要做什么,但你过滤的第一行看起来不对:

        tempPreviousToken.attSource.copyTo(this);
        previousTokenFlag = false;
        this.incrementToken();
        return false;

首先,将 tempPreviousToken 复制到当前令牌(tempPreviousToken.attSource.copyTo(this)),然后始终返回false,从而无法使用当前令牌。您应该直接返回false,或者根据您尝试复制的令牌返回true / false。