Что-то не так с TextDatasetFactory - PullRequest
0 голосов
/ 22 января 2020

Я работаю с текстовым поиском, используя Jena и Lucene. После того, как я запускаю его, появляются некоторые ошибки. Это показывает в Dataset ds = TextDatasetFactory.createLucene(ds1, dir, new TextIndexConfig(entDef)); и Dataset ds = createCode();. Мой полный код показан ниже:

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));
}}

Поскольку я новичок ie, буквально я не понимаю, что с ним не так. Может быть, дело в TextDatasetFactory или что-то еще. Пожалуйста, посоветуйте мне.

ps: я получил эти коды от этого и ничего плохого оттуда нет. ps еще раз: ошибки отображаются только когда я его скомпилировал (красная строка в консоли), как показано ниже:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/lucene/analysis/miscellaneous/PerFieldAnalyzerWrapper
at org.apache.jena.query.text.TextDatasetFactory.createLuceneIndex(TextDatasetFactory.java:109)
at org.apache.jena.query.text.TextDatasetFactory.createLucene(TextDatasetFactory.java:136)
at main.JenaTextSearch.createCode(JenaTextSearch.java:70)
at main.JenaTextSearch.main(JenaTextSearch.java:42)

JenaTextSearch. java - это проект с ошибками.

1 Ответ

0 голосов
/ 22 января 2020

"java .lang.NoClassDefFoundError" - это ошибка из Java о том, что что-то отсутствует. Это jena-текстовые зависимости, отсутствующие (здесь, Lucene) в пути к классам во время выполнения.

Лучше, если вы используете инструмент сборки, такой как Maven или Gradle.

Зависимости включают в себя: (взято из mvn dependency:tree; mvn dependency:build-classpath создаст для вас classpath и распечатает его, если вы хотите включить его в другом месте).

[INFO] +- org.apache.lucene:lucene-core:jar:7.4.0:compile
[INFO] +- org.apache.lucene:lucene-analyzers-common:jar:7.4.0:compile
[INFO] +- org.apache.lucene:lucene-queryparser:jar:7.4.0:compile
[INFO] |  +- org.apache.lucene:lucene-queries:jar:7.4.0:compile
[INFO] |  \- org.apache.lucene:lucene-sandbox:jar:7.4.0:compile
[INFO] +- org.apache.lucene:lucene-highlighter:jar:7.4.0:compile
[INFO] |  +- org.apache.lucene:lucene-join:jar:7.4.0:compile
[INFO] |  \- org.apache.lucene:lucene-memory:jar:7.4.0:compile
[INFO] +- org.apache.lucene:lucene-backward-codecs:jar:7.4.0:compile
...