如何解决测试Lucene 4.0时的NoSuchFieldError异常



我想测试我自己的分析器。以下是Lucene in Action 2 Edition, code List 4.2, page 121中的测试代码。

public class AnalyzerUtils {
    public static void displayTokens(Analyzer analyzer, String text) throws IOException {
        TokenStream tokenStream = analyzer.tokenStream("contents", new StringReader(text));
        displayTokens(tokenStream);
    }
    public static void displayTokens(TokenStream stream) throws IOException {
        CharTermAttribute term = stream.getAttribute(CharTermAttribute.class);
        while(stream.incrementToken()) {
            System.out.println(Arrays.toString(term.buffer()));
        }
    }
}

我定制的分析仪是:

 static class SimpleAnalyzer extends Analyzer {
    static class SimpleFilter extends TokenFilter {
        protected SimpleFilter(TokenStream input) { super(input); }
        @Override
        public boolean incrementToken() throws IOException { return false; }
    }
    @Override
    protected TokenStreamComponents createComponents(String s, Reader reader) {
        Tokenizer tokenizer = new WhitespaceTokenizer(reader);
        return new TokenStreamComponents(tokenizer, new SimpleFilter(tokenizer));
    }
}
static class FilteringAnalyzer extends Analyzer {
    static class FilteringFilter extends FilteringTokenFilter {
        public FilteringFilter(TokenStream in) { super(in); }
        @Override
        protected boolean accept() throws IOException { return false; }
    }
    @Override
    protected TokenStreamComponents createComponents(String s, Reader reader) {
        Tokenizer tokenizer = new WhitespaceTokenizer(reader);
        return new TokenStreamComponents(tokenizer, new FilteringFilter(tokenizer));
    }
}

问题是,如果我运行AnalyzerUtils.displayTokens(new SimpleAnalyzer(), "美国 法国 中国");,它是好的;然而,运行AnalyzerUtils.displayTokens(new FilteringAnalyzer(), "美国 法国 中国");,我得到了这个异常:

Exception in thread "main" java.lang.NoSuchFieldError: LATEST
    at org.apache.lucene.analysis.util.FilteringTokenFilter.<init>(FilteringTokenFilter.java:70)
    at cn.edu.nju.ws.miliqa.nlp.ner.index.NameEntityIndexing$FilteringFilter.<init>(NameEntityIndexing.java:62)
    at cn.edu.nju.ws.miliqa.nlp.ner.index.NameEntityIndexing$FilteringAnalyzer.createComponents(NameEntityIndexing.java:83)
    at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:134)
    at cn.edu.nju.ws.miliqa.lucene.AnalyzerUtils.displayTokens(AnalyzerUtils.java:19)

两个测试用例的区别是分析仪中的滤波器扩展了TokenFilterFilteringTokenFilter。我已经做了三天了,但还是没有头绪。这个奇怪的例外的原因是什么?

java.lang.NoSuchFieldError运行时异常意味着您有一个类试图访问另一个不存在的类上的字段。错误的类是FilteringTokenFilter。

很可能,你的类路径中有多个版本的Lucene。

你在标题中提到你使用4.0,但版本。LATEST(这个异常所抱怨的字段缺少)直到Lucene 4.10才被引入。

这意味着也许你在Lucene 4.10+ jar文件中有一个FilteringTokenFilter.class的副本,试图在旧版本(4.0?)中找到字段"LATEST"。Version.class文件。

检查在你的类路径中每个"lucene-core"one_answers"lucene- analysers -common" jar文件只有一个副本,并且它们的版本号都是匹配的。如果您不确定,请重新下载以确保有匹配的版本。

最新更新