Lucene's incrementToken () последний член игнорируется - PullRequest
0 голосов
/ 24 февраля 2012

Я пытался реализовать собственный анализатор в 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 голосов
/ 24 февраля 2012

Я не уверен, что вы пытаетесь сделать, но первые строки вашего фильтра выглядят неправильно:

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

Сначала вы копируете tempPreviousToken в текущий токен (tempPreviousToken.attSource.copyTo(this)), и тогда вы всегда возвращаете ложное значение, не давая возможности использовать текущий токен.Вы должны либо вернуть false напрямую, либо вернуть true / false в зависимости от токена, который вы пытались скопировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...