Анализатор порта Lucene 3.6.2 к Lucene 5.5.0

Для Lucene 3.6.2меня есть следующий анализатор:

public final class StandardAnalyzerV36 extends Analyzer {

    private Analyzer analyzer;

    public StandardAnalyzerV36() {
        analyzer = new StandardAnalyzer(Version.LUCENE_36);
    }

    public StandardAnalyzerV36(Set<?> stopWords) {
        analyzer = new StandardAnalyzer(Version.LUCENE_36, stopWords);
    }

    @Override
    public final TokenStream tokenStream(String fieldName, Reader reader) {
        return analyzer.tokenStream(fieldName, new HTMLStripCharFilter(CharReader.get(reader)));
    }

    @Override
    public final TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException {
        return analyzer.reusableTokenStream(fieldName, reader);
    }

}

Не могли бы вы помочь мне перенести его на анализатор для Lucene 5.5.0? В новой версии изменен интерфейс анализатора.

УСОВЕРШЕНСТВОВАННЫЙ

Я перенастроил этот анализатор на следующий:

public final class StandardAnalyzerV36 extends Analyzer {

    public static final CharArraySet STOP_WORDS_SET = StopAnalyzer.ENGLISH_STOP_WORDS_SET;  

    @Override
    protected TokenStreamComponents createComponents(String fieldName) {

        final ClassicTokenizer src = new ClassicTokenizer();
        TokenStream tok = new StandardFilter(src);
        tok = new StopFilter(new LowerCaseFilter(tok), STOP_WORDS_SET);
        return new TokenStreamComponents(src, tok);
    }

    @Override
    protected Reader initReader(String fieldName, Reader reader) {
        return new HTMLStripCharFilter(reader);
    }

но мои тесты терпят неудачу при следующем вызове:

tokens = LuceneUtils.tokenizeString(analyzer, "[{(RDBMS)}]");

public static List<String> tokenizeString(Analyzer analyzer, String string) {
        List<String> result = new ArrayList<String>();
        try {
            TokenStream stream = analyzer.tokenStream(null, new StringReader(string));
            stream.reset();
            while (stream.incrementToken()) {
                result.add(stream.getAttribute(CharTermAttribute.class).toString());
            }
        } catch (IOException e) {
            // not thrown b/c we're using a string reader...
            throw new RuntimeException(e);
        }
        return result;
    }

за следующим исключением:

java.lang.IllegalStateException: TokenStream contract violation: close() call missing
    at org.apache.lucene.analysis.Tokenizer.setReader(Tokenizer.java:90)
    at org.apache.lucene.analysis.Analyzer$TokenStreamComponents.setReader(Analyzer.java:315)
    at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:143)

Что не так с этим кодом ?

1 ответ

  1. Наконец, я получил это работает:

    public final class StandardAnalyzerV36 extends Analyzer {
    
        public static final CharArraySet STOP_WORDS_SET = StopAnalyzer.ENGLISH_STOP_WORDS_SET;  
    
        @Override
        protected TokenStreamComponents createComponents(String fieldName) {
    
            final ClassicTokenizer src = new ClassicTokenizer();
            TokenStream tok = new StandardFilter(src);
            tok = new StopFilter(new LowerCaseFilter(tok), STOP_WORDS_SET);
    
            return new TokenStreamComponents(src, tok);
        }
    
        @Override
        protected Reader initReader(String fieldName, Reader reader) {
            return new HTMLStripCharFilter(reader);
        }
    }
    
    public class LuceneUtils {
    
        public static List<String> tokenizeString(Analyzer analyzer, String string) {
            List<String> result = new ArrayList<String>();
            TokenStream stream = null;
            try {
                stream = analyzer.tokenStream(null, new StringReader(string));
                stream.reset();
                while (stream.incrementToken()) {
                    result.add(stream.getAttribute(CharTermAttribute.class).toString());
                }
            } catch (IOException e) {
                // not thrown b/c we're using a string reader...
                throw new RuntimeException(e);
            } finally {
                IOUtils.closeQuietly(stream);
            }
            return result;
        }
    }