我想测试自己的分析器。以下是来自 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)
测试用例之间的差异是分析器中的过滤器扩展TokenFilter
或FilteringTokenFilter
。我已经工作了三天,但仍然不知道它。这个奇怪的例外是什么原因?
答案 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文件只有一个副本,并且它们都是匹配的版本号。如果您不确定,请再次下载它们以确保您具有匹配的版本。