我仍然坚持与耶拿(Jena)和露西(Lucene)进行文字搜索。我编译它后出现了一些错误,并且修复了一个错误后,它总是显示另一个错误。我的完整代码如下:
public class JenaTextSearch {
static {LogCtl.setLog4j();
BasicConfigurator.configure();}
static Logger log = LoggerFactory.getLogger("JenaTextSearch");
public static void main (String ...argv)
{
Dataset ds = createCode();
//loadData(ds, "data.ttl");
queryData(ds);
}
public static Dataset createCode()
{
//base data
Dataset ds1 = DatasetFactory.create();
Model defaultModel = ModelFactory.createDefaultModel();
defaultModel.read("to_index/data.ttl", "N-TRIPLES");
ds1.setDefaultModel(defaultModel);
//define the index mapping
EntityDefinition entDef = new EntityDefinition ("uri", "text", ResourceFactory.createProperty(App.URI_PREFIX,"content"));
Directory dir = null;
try {
dir = new SimpleFSDirectory(Paths.get("index")); //lucene index directory
}
catch (IOException e) {
e.printStackTrace();
}
//join together into a dataset
Dataset ds = TextDatasetFactory.createLucene(ds1, dir, new TextIndexConfig(entDef));
return ds1;
}
public static void queryData(Dataset dataset)
{
String prefix = "PREFIX email: <" + App.URI_PREFIX+">" +
"PREFIX text: <http://jena.apache.org/text#>";
long startTime = System.nanoTime();
System.out.println("Email's content contains 'good'");
String query = "SELECT * WHERE " +
"{ ?s text:query (email:content 'good'." +
" ?s email:content ?text . " +
" }" ;
dataset.begin(ReadWrite.READ);
try {
Query q = QueryFactory.create(prefix+"\n"+query);
QueryExecution qexec = QueryExecutionFactory.create(q, dataset);
QueryExecUtils.executeQuery(q, qexec);
}finally { dataset.end();}
long finishTime = System.nanoTime();
double time = (finishTime-startTime)/1.0e6;
System.out.println ("Query "+String.format("FINISH - %.2fms", time));
startTime = System.nanoTime();
System.out.println("Email's content contains 'bad'");
query = "SELECT * WHERE" +
"{ (?s ?score ?lit) text:query (email:content 'bad' \"highlight:s:<em class='hiLite'> | e:</em>\") ." +
" ?s email:content ?text . " +
" }" ;
dataset.begin(ReadWrite.READ);
try {
Query q = QueryFactory.create(prefix+"\n"+query);
QueryExecution qexec = QueryExecutionFactory.create(q, dataset);
QueryExecUtils.executeQuery(q, qexec);
} finally { dataset.end() ; }
finishTime = System.nanoTime();
time = (finishTime-startTime)/1.0e6;
System.out.println("Query "+String.format("FINISH - %.2fms", time));
}}
我上次编译后的错误描述显示:Exception in thread "main" java.lang.NoSuchMethodError: org.apache.lucene.analysis.AnalyzerWrapper: method <init>()V not found
。
“ NoSuchMethodError”是什么意思?我可以跳过一个Lucene库吗?请给我提意见。谢谢。
缺少的方法是AnalyzerWrapper#<init>()V
,即类org.apache.lucene.analysis.AnalyzerWrapper
的无参数构造函数。它存在于lucene-core
库的早期版本中,然后不推荐使用,最后将其删除。
您使用库的最新版本运行应用程序,但是应用程序的某些部分是针对旧版本(存在no-arg构造函数的地方)编译的。这可以是您的代码,也可以是某些第三方库。
[您可以查看堆栈跟踪以确定应用程序的哪一部分调用no-arg构造函数,因此需要进行重构和重新编译,或者将其替换为最新版本。