测试Lucene 4.0时如何解决NoSuchFieldError异常
How to resolve NoSuchFieldError exception when testing Lucene 4.0
我想测试我自己的分析仪。以下是来自 Lucene in Action 第 2 版,代码列表 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(), "美国 法国 中国");
,没问题;但是,运行ning 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 runtime exception means you have one class attempting to access a field on another class that doesn't exist. The offending class was FilteringTokenFilter.
很可能,您的 class路径中有多个版本的 Lucene。
您在标题中提到您使用的是 4.0,但是 Version.LATEST(此异常抱怨的字段缺失)直到 Lucene 4.10 才引入。
这意味着您可能在 Lucene 4.10+ jar 文件中有一个 FilteringTokenFilter.class 的副本,试图在较旧的(4.0?)Version.class 文件中找到字段 "LATEST"。
检查您的 class 路径中每个 "lucene-core" 和 "lucene-analyzers-common" jar 文件只有一份副本,并且它们都匹配版本号。如果您不确定,请重新下载它们以确保您有匹配的版本。
我想测试我自己的分析仪。以下是来自 Lucene in Action 第 2 版,代码列表 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(), "美国 法国 中国");
,没问题;但是,运行ning 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 runtime exception means you have one class attempting to access a field on another class that doesn't exist. The offending class was FilteringTokenFilter.
很可能,您的 class路径中有多个版本的 Lucene。
您在标题中提到您使用的是 4.0,但是 Version.LATEST(此异常抱怨的字段缺失)直到 Lucene 4.10 才引入。
这意味着您可能在 Lucene 4.10+ jar 文件中有一个 FilteringTokenFilter.class 的副本,试图在较旧的(4.0?)Version.class 文件中找到字段 "LATEST"。
检查您的 class 路径中每个 "lucene-core" 和 "lucene-analyzers-common" jar 文件只有一份副本,并且它们都匹配版本号。如果您不确定,请重新下载它们以确保您有匹配的版本。