Я создал собственный фильтр токенов, который объединяет все токены в потоке. Это моя 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;
}
Похоже, тот же класс используется повторно. Имеет смысл.