gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:25:02 25 4
gpt4 key购买 nike

我想测试我自己的分析器。以下是来自 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(), "美国法国中国");,就可以了;但是,运行 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运行时异常意味着您有一个类试图访问另一类上不存在的字段。违规类(class)是 FilteringTokenFilter .

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

您在标题中提到您正在使用 4.0,但是 Version.LATEST (此异常所提示的字段缺失)直到 Lucene 4.10 才引入。

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

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

关于java - 测试Lucene 4.0时如何解决NoSuchFieldError异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30453724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com