如何在测试Lucene 4.0

时间:2015-05-26 08:45:15

标签: java lucene

我想测试自己的分析器。以下是来自 Lucene in Action 2nd Edition,Code List 4.2,第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。我已经工作了三天,但仍然不知道它。这个奇怪的例外是什么原因?

1 个答案:

答案 0 :(得分:2)

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

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

你提到你在标题中使用了4.0,但是在Lucene 4.10之前没有引入Version.LATEST(这个异常抱怨的字段缺失)。

这意味着您可能在Lucene 4.10+ jar文件中有一个FilteringTokenFilter.class副本,试图在较旧的(4.0?)Version.class文件中找到“LATEST”字段。

检查您的类路径中每个“lucene-core”和“lucene-analyzers-common”jar文件只有一个副本,并且它们都是匹配的版本号。如果您不确定,请再次下载它们以确保您具有匹配的版本。