我想测试我自己的分析器。以下是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)
两个测试用例的区别是分析仪中的滤波器扩展了TokenFilter
或FilteringTokenFilter
。我已经做了三天了,但还是没有头绪。这个奇怪的例外的原因是什么?
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文件只有一个副本,并且它们的版本号都是匹配的。如果您不确定,请重新下载以确保有匹配的版本。