Игнорировать вывод токена в методе Lucene IncrementToken () - PullRequest
0 голосов
/ 07 февраля 2012

Я пытаюсь создать пользовательский фильтр в Lucene, который просто распознает, начинаются ли два последовательных слова в тексте с заглавной буквы, а остальные - в нижнем регистре, и в этом случае два слова должны быть объединены в один токен.

Переопределенный метод incrementToken имеет следующий код

@Override
    public boolean incrementToken() throws IOException {
        if(!input.incrementToken()){ 
     return false;}
     //Case were the previous token WAS NOT starting with capital letter and the     rest small   
     if(previousTokenCanditateMainName==false)
     {
            if(CheckIfMainName(termAtt.term()))
            {
                previousTokenCanditateMainName=true;
                tempString=this.termAtt.term() ;                           /*This is the*/
               // myToken.offsetAtt=this.offsetAtt;                             /*Token i need to "delete"*/
            tempStartOffset=this.offsetAtt.startOffset();
            tempEndOffset=this.offsetAtt.endOffset();
            return true;
        }
        else
        {
            return true;
        }
 }
 //Case were the previous token WAS a Proper name (starting with Capital and continuiing with small letters)
     else
         {
         if(CheckIfMainName(termAtt.term()))
         {
             previousTokenCanditateMainName=false;
             posIncrAtt.setPositionIncrement(0);
             termAtt.setTermBuffer(tempString+TOKEN_SEPARATOR+this.termAtt.term());
             offsetAtt.setOffset(tempStartOffset, this.offsetAtt.endOffset());
             return true;
         }
         else
         {
             previousTokenCanditateMainName=false;
             return true;
         }
     }

}

Мой вопрос заключается в том, как, когда я найду первый токен, отвечающий моим требованиям, я могу его "проигнорировать".В настоящее время код отлично работает при соединении двух токенов, но я также получаю дополнительный токен с первым из двух идентифицированных мной.Я попытался использовать тот же метод setEnableIncrementsPosition (true), что и встроенный stopFilter, но в этом случае мой фильтр должен быть типа TokenFilter, который не позволяет мне переопределить метод incrementToken.

Надеюсь, я сформулировалмоя проблема правильно

1 Ответ

0 голосов
/ 07 февраля 2012

У вас может быть собственный метод:

private void tokenize() 

, где вы делаете расщепление и пользовательские объединения. Полученный List<String> tokens должен быть сохранен как атрибут токенизатора.

В методе incrementToken вы просто проверяете, является ли это attribute значением null, и инициализируете его при необходимости.

Вам также необходимо добавить токены в методе incrementToken() к termAttribute

termAttribute.append(tokens.get(tokenIndex));

это включает в себя, что ваш токенизатор должен иметь такой атрибут:

private CharTermAttribute termAttribute = addAttribute(CharTermAttribute.class);

Вероятно, вам нужна также тонкая настройка. Но это всего лишь черновик того, как этого можно достичь довольно простым способом.

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