Lucene как отключить toLowerCase в StandardAnalyzer?

Хочу использовать токенайзер, чтобы достать токены из моего текста.

Мой код:

        ArrayList<String> toTextWord = new ArrayList<>(); 
        Analyzer analyzer = new StandardAnalyzer();

        try (TokenStream stream = analyzer.tokenStream("tags", new StringReader(iterStr))) {

            stream.addAttribute(CharTermAttribute.class);
            stream.reset();
            while (stream.incrementToken()) {
                CharTermAttribute token = stream.getAttribute(CharTermAttribute.class);
                System.out.println(token.toString());
                toTextWord.add(token.toString());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

Но StandardAnalyzer() по умолчанию использует перевод слова в нижний регистр, как можно отключить у него toLowerCase? Или что еще можно попробовать в данной ситуации? Заранее спасибо!


Ответы (1 шт):

Автор решения: Roman Konoval

Если задача оставить весь функционал StandardAnalyzer кроме перевода в нижний регистр, то нужно переопределить createComponents и убрать оттуда LowerCaseFilter:

class MyAnalyzer extends StandardAnalyzer {
@Override
  protected TokenStreamComponents createComponents(final String fieldName) {
    final StandardTokenizer src = new StandardTokenizer();
    src.setMaxTokenLength(maxTokenLength);
    TokenStream tok = new StopFilter(src, stopwords);
    return new TokenStreamComponents(
        r -> {
          src.setMaxTokenLength(StandardAnalyzer.this.maxTokenLength);
          src.setReader(r);
        },
        tok);
  }
}
→ Ссылка