Фильтры токенов, такие как ASCIIFoldingFilter, в своей основе являются TokenStream, поэтому анализатор возвращает их, главным образом, с помощью следующего метода:
public abstract TokenStream tokenStream(String fieldName, Reader reader);
Как вы заметили, фильтрыпринять TokenStream в качестве входных данных.Они действуют как обертки или, точнее говоря, как декораторы на их вход.Это означает, что они улучшают поведение содержимого TokenStream, выполняя как свою операцию, так и операцию содержимого ввода.
Вы можете найти объяснение здесь .Он не имеет прямого отношения к ASCIIFoldingFilter, но применяется тот же принцип.По сути, вы создаете пользовательский анализатор с чем-то вроде этого (упрощенный пример):
public class CustomAnalyzer extends Analyzer {
// other content omitted
// ...
public TokenStream tokenStream(String fieldName, Reader reader) {
TokenStream result = new StandardTokenizer(reader);
result = new StandardFilter(result);
result = new LowerCaseFilter(result);
// etc etc ...
result = new StopFilter(result, yourSetOfStopWords);
result = new ASCIIFoldingFilter(result);
return result;
}
// ...
}
И TokenFilter, и Tokenizer являются подклассами TokenStream .
Помните также, что вы должны использовать один и тот же пользовательский анализатор как при индексировании, так и при поиске, иначе вы можете получить неверные результаты в своих запросах.