Моя цель - использовать некоторые из многих токенизаторов и фильтров Lucene для преобразования входного текста, но без создания каких-либо индексов.
Например, учитывая эту (надуманную) входную строку ...
" Someone’s - [texté] goes here, foo . "
... и анализатор Lucene, подобный этому ...
Analyzer analyzer = CustomAnalyzer.builder()
.withTokenizer("icu")
.addTokenFilter("lowercase")
.addTokenFilter("icuFolding")
.build();
Я хочу получить следующий вывод:
someone's texte goes here foo
Метод, приведенный ниже Java, делает то, что я хочу.
Но есть ли лучший (то есть более типичный и / или сжатый) способ, которым я должен делать это?
Я специально думаю о том, как я использовал TokenStream
и CharTermAttribute
, так как я никогда не использовал их раньше. Чувствует себя неуклюже.
Вот код:
Lucene 8.3.0 import:
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.custom.CustomAnalyzer;
Мой метод:
private String transform(String input) throws IOException {
Analyzer analyzer = CustomAnalyzer.builder()
.withTokenizer("icu")
.addTokenFilter("lowercase")
.addTokenFilter("icuFolding")
.build();
TokenStream ts = analyzer.tokenStream("myField", new StringReader(input));
CharTermAttribute charTermAtt = ts.addAttribute(CharTermAttribute.class);
StringBuilder sb = new StringBuilder();
try {
ts.reset();
while (ts.incrementToken()) {
sb.append(charTermAtt.toString()).append(" ");
}
ts.end();
} finally {
ts.close();
}
return sb.toString().trim();
}