Solr (Lucene) индексирует только первый документ после добавления пользовательского TokenFilter - PullRequest
5 голосов
/ 01 октября 2011

Я создал собственный фильтр токенов, который объединяет все токены в потоке. Это моя incrementToken() функция

public boolean incrementToken() throws IOException {                        
    if (finished) {                                                         
        logger.debug("Finished");                                           
        return false;                                                       
    }                                                                       
    logger.debug("Starting");                                               
    StringBuilder buffer = new StringBuilder();                             
    int length = 0;                                                         
    while (input.incrementToken()) {                                        
        if (0 == length) {                                                  
            buffer.append(termAtt);                                         
            length += termAtt.length();                                     
        } else {                                                            
            buffer.append(" ").append(termAtt);                             
            length += termAtt.length() + 1;                                 
        }                                                                   
    }                                                                       
    termAtt.setEmpty().append(buffer);                                      
    //offsetAtt.setOffset(0, length);                                       
    finished = true;                                                        
    return true;                                                            
}

Я добавил новый Фильтр в конец цепочки индекса и анализа запросов для поля, и тестирование фильтра из http://localhost:8983/solr/admin/analysis.jsp похоже работает. Фильтр объединяет токены в потоке. Но при повторной индексации документов индексируется только мой первый документ.

Вот так выглядит моя цепочка фильтров.

        <analyzer type="index">                                             
            <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[-_]" replacement=" " />
            <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[^\p{L}\p{Nd}\p{Mn}\p{Mc}\s+]" replacement="" />
            <tokenizer class="solr.WhitespaceTokenizerFactory" />           
            <filter class="solr.LowerCaseFilterFactory" />                  
            <filter class="solr.StopWordFilterFactory" ignoreCase="true"               words="words.txt" />
            <filter class="org.custom.solr.analysis.ConcatFilterFactory" />
        </analyzer>                                                         
        <analyzer type="query">                                             
            <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[-_]" replacement=" " />
            <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[^\p{L}\p{Nd}\p{Mn}\p{Mc}\s+]" replacement="" />
            <tokenizer class="solr.WhitespaceTokenizerFactory" />           
            <filter class="solr.LowerCaseFilterFactory" />                  
            <filter class="solr.StopWordFilterFactory" ignoreCase="true"               words="words.txt" />
            <filter class="org.custom.solr.analysis.ConcatFilterFactory" />
        </analyzer>

Без ConcatFilterFactory все слова индексируются правильно, но с ConcatFilterFactory индексируется только первый документ. Что я делаю неправильно? Пожалуйста, помогите мне понять проблему.

ОБНОВЛЕНИЕ:

Наконец-то разобрался с проблемой.

if (finished) {                                                         
    logger.debug("Finished"); 
    finished = false;                                  
    return false;                                                       
}  

Похоже, тот же класс используется повторно. Имеет смысл.

1 Ответ

0 голосов
/ 05 сентября 2013

Вы должны написать модульный тест для вашего фильтра. Это должно дать сбой, даже если ваш анализ работает. Видимо, вы забыли добавить эту строку перед возвратом false:

finished = false;
...