java - NoSuchMethodError:org.apache.lucene.document.Field
问题描述
我还有另一个项目,jena 全文搜索,但我在运行时出错。错误显示如下:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.lucene.document.Field.<init>(Ljava/lang/String;Ljava/lang/String;Lorg/apache/lucene/index/IndexableFieldType;)V
at org.apache.jena.query.text.TextIndexLucene.doc(TextIndexLucene.java:347)
at org.apache.jena.query.text.TextIndexLucene.addDocument(TextIndexLucene.java:308)
at org.apache.jena.query.text.TextIndexLucene.addEntity(TextIndexLucene.java:300)
at org.apache.jena.query.text.TextDocProducerTriples.change(TextDocProducerTriples.java:71)
at org.apache.jena.sparql.core.DatasetGraphMonitor.record(DatasetGraphMonitor.java:194)
at org.apache.jena.sparql.core.DatasetGraphMonitor.add$(DatasetGraphMonitor.java:114)
at org.apache.jena.sparql.core.DatasetGraphMonitor.add(DatasetGraphMonitor.java:108)
at org.apache.jena.sparql.core.GraphView.performAdd(GraphView.java:149)
at org.apache.jena.graph.impl.GraphBase.add(GraphBase.java:184)
at org.apache.jena.riot.system.StreamRDFLib$ParserOutputGraph.triple(StreamRDFLib.java:181)
at org.apache.jena.riot.lang.LangTurtle.emit(LangTurtle.java:57)
at org.apache.jena.riot.lang.LangTurtleBase.emitTriple(LangTurtleBase.java:486)
at org.apache.jena.riot.lang.LangTurtleBase.objectList(LangTurtleBase.java:352)
at org.apache.jena.riot.lang.LangTurtleBase.predicateObjectItem(LangTurtleBase.java:288)
at org.apache.jena.riot.lang.LangTurtleBase.predicateObjectList(LangTurtleBase.java:269)
at org.apache.jena.riot.lang.LangTurtleBase.triples(LangTurtleBase.java:250)
at org.apache.jena.riot.lang.LangTurtleBase.triplesSameSubject(LangTurtleBase.java:191)
at org.apache.jena.riot.lang.LangTurtle.oneTopLevelElement(LangTurtle.java:46)
at org.apache.jena.riot.lang.LangTurtleBase.runParser(LangTurtleBase.java:91)
at org.apache.jena.riot.lang.LangBase.parse(LangBase.java:41)
at org.apache.jena.riot.RDFParserRegistry$ReaderRIOTLang.read(RDFParserRegistry.java:191)
at org.apache.jena.riot.RDFParser.read(RDFParser.java:352)
at org.apache.jena.riot.RDFParser.parseURI(RDFParser.java:321)
at org.apache.jena.riot.RDFParser.parse(RDFParser.java:295)
at org.apache.jena.riot.RDFParserBuilder.parse(RDFParserBuilder.java:506)
at org.apache.jena.riot.RDFDataMgr.parseFromURI(RDFDataMgr.java:890)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:221)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:102)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:93)
at main.Search.loadData(Search.java:103)
at main.Search.main(Search.java:50)
我尝试将其包含org.apache.lucene.document.Field
在我的 Lucene Lib 中,但它不起作用。我认为这可能是loadData
我的代码中的问题。完整代码如下:
public class Search {
static String URI = "http://www.tutorialacademy.com/jenatext#";
static {LogCtl.setLog4j();
BasicConfigurator.configure();}
static Logger log = LoggerFactory.getLogger("Search");
public static void main(String ... argv)
{
TextQuery.init();
Dataset ds = createIndexedDataset("tdb", "luceneindex", "hasLongText");
loadData(ds, "res/data2.ttl");
queryData(ds);
}
public static Dataset createIndexedDataset(String tdbPath, String lucenePath, String indexedProperty)
{
Dataset graphDS = null;
if(tdbPath == null)
{
System.out.println("Construct an in-memory dataset");
graphDS = DatasetFactory.createMem();
}else
{
System.out.println("Construct a persistant TDB based dataset to: " + tdbPath);
graphDS = DatasetFactory.create();
}
//define the index mapping
EntityDefinition entDef = new EntityDefinition ("uri", "text", ResourceFactory.createProperty(URI, indexedProperty));
Directory luceneDir = null;
// check for in memory or file based (persistant) index
if (lucenePath == null)
{
System.out.println("Construct an in-memory lucene index");
luceneDir = new RAMDirectory();
}else
{
try
{
System.out.println("Construct a persistant lucene index to: " + lucenePath);
luceneDir = new SimpleFSDirectory(Paths.get(lucenePath));
}
catch (IOException e)
{
e.printStackTrace();
}
}
//create new indexed dataset: insert operations are automatically indexed with lucene
Dataset ds = TextDatasetFactory.createLucene(graphDS, luceneDir, new TextIndexConfig(entDef));
return ds;
}
public static void loadData(Dataset dataset, String file)
{
System.out.println("Load data...");
long startTime = System.currentTimeMillis();
dataset.begin(ReadWrite.WRITE);
try
{
Model m = dataset.getDefaultModel();
RDFDataMgr.read(m, file);
dataset.commit();
}
finally
{
dataset.end();
}
long finishTime = System.currentTimeMillis();
long time = finishTime - startTime;
System.out.println("Loading finished after "+ time+ " ms");
}
public static void queryData(Dataset dataset)
{
System.out.println("Query data...");
String prefix = "PREFIX ta: <" + URI + ">"+
"PREFIX text: <http://jena.apache.org/text#>";
String query = "SELECT * WHERE" +
"{ ?s text:query (ta:hasLongText 'g?eat')."+
" ?s ta.hasLongText ?text . "+
"}";
long startTime = System.currentTimeMillis();
dataset.begin(ReadWrite.READ);
try
{
Query q = QueryFactory.create(prefix + query);
QueryExecution qexec = QueryExecutionFactory.create(q,dataset);
QueryExecUtils.executeQuery(q, qexec);
}
finally
{
dataset.end();
}
long finishTime = System.currentTimeMillis();
long time = finishTime- startTime;
System.out.println("Query finished after " + time +" ms.");
}}
我可以得到一些建议吗?谢谢
解决方案
我猜你有 Lucene 8.0 或更高版本,它看起来不像 Jena 支持。确保您使用正确版本的 lucene 用于您拥有的任何版本的 Jena:https ://jena.apache.org/documentation/query/text-query.html
推荐阅读
- postgresql - Postges - 多列索引 - 前导(最左边)列
- javascript - 如何同时为所有用户运行 JavaScript 代码并为所有用户显示相同的生成数字
- php - Symfony“未检测到 PHP 二进制文件”
- python - 为什么numpy数组中相同索引选择的输出存在差异
- mysql - How to copy column values to a new SQL table, remove duplicates and create mappings?
- java - Why does java.util.Optional.ofNullable() expect @NonNullable?
- julia - 为值分配颜色
- sql - Try to make a view but have a problem ORA-00979: not a GROUP BY expression
- java - Flutter doctor --android-licenses problem
- python - xpath for scraping critic's reviews from rotten tomatoes