В Lucene есть анализаторы, которые в основном токенизируют и фильтруют корпус при индексации.Операции включают в себя преобразование токенов в нижний регистр, создание стволов, удаление стоп-слов и т. Д.
Я провожу эксперимент, в котором я хочу попробовать все возможные комбинации операций анализа: только остановка, только остановка, остановка и остановка, ...
Всего 36 комбинаций, которые я хочу попробовать.
Как мне легко и изящно это сделать?
Я знаю, что могу расширить класс Analyzer.и реализовать функцию tokenStream () для создания моего собственного анализатора:
public class MyAnalyzer extends Analyzer
{
public TokenStream tokenStream(String field, final Reader reader){
return new NameFilter(
CaseNumberFilter(
new StopFilter(
new LowerCaseFilter(
new StandardFilter(
new StandardTokenizer(reader)
)
), StopAnalyzer.ENGLISH_STOP_WORDS)
)
);
}
Я хотел бы написать один такой класс, который может каким-то образом принимать логические значения для каждой из возможных операций (doStopping,доСтемминг и т. д.).Я не хочу писать 36 различных классов Analyzer, каждый из которых выполняет одну из 36 комбинаций.Что затрудняет то, как фильтры все объединяются вместе в своих конструкторах.
Есть идеи, как это сделать изящно?
РЕДАКТИРОВАТЬ : «Изящно»Я имею в виду, что я могу легко создать новый Анализатор в каком-то цикле:
analyzer = new MyAnalyzer(doStemming, doStopping, ...)
, где doStemming и doStopping меняются с каждой итерацией цикла.