Полнотекстовый поиск Lucene работает только для меток, которые точно соответствуют строке поиска - PullRequest
0 голосов
/ 17 сентября 2018

У меня проблемы с тем, чтобы полнотекстовый поиск работал с Apache Lucene. Я могу получить имена, когда набираю целую метку, например, «кошка», но ввод «с» ничего не дает. Я использую RDF4J. Это запрос SPARQL, который я использую:

SELECT DISTINCT ?e2 ?altLabel ?label ?description WHERE
    {
       {
          ?e2 search:matches ?match .
           ?match search:query ?string ;
                  search:property ?labelIri ;
                  search:snippet ?altLabel
        }
     ?e2 ?labelIri ?label.
     }

LuceneSailConnection затем преобразует его в:

Distinct
   Projection
      ProjectionElemList
         ProjectionElem "e2"
         ProjectionElem "label"
         ProjectionElem "description"
      Extension
         ExtensionElem (description)
            Var (name=description)
         Join
            Join
               Join
                  StatementPattern
                     Var (name=e2)
                     Var (name=_const_232d65d1_uri, value=http://www.openrdf.org/contrib/lucenesail#matches, anonymous)
                     Var (name=match)
                  StatementPattern
                     Var (name=match)
                     Var (name=_const_802884e6_uri, value=http://www.openrdf.org/contrib/lucenesail#query, anonymous)
                     Var (name=string)
               StatementPattern
                  Var (name=match)
                  Var (name=_const_f59a94f7_uri, value=http://www.openrdf.org/contrib/lucenesail#property, anonymous)
                  Var (name=labelIri)
            StatementPattern
               Var (name=e2)
               Var (name=labelIri)
               Var (name=label)

Этот код используется для индексации понятий и их меток в Базе знаний:

@Override
public void indexLocalKb(KnowledgeBase aKb) throws IOException
{
    Analyzer analyzer = new StandardAnalyzer();
    Directory directory = FSDirectory
        .open(new File(luceneIndexDir, aKb.getRepositoryId()).toPath());
    IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(analyzer));

    try (RepositoryConnection conn = getConnection(aKb)) {
        RepositoryResult<Statement> stmts = RdfUtils
            .getStatementsSparql(conn, null, aKb.getLabelIri(), null,
                Integer.MAX_VALUE, false, null);
        while (stmts.hasNext()) {
            Statement stmt = stmts.next();
            String id = stmt.getSubject().stringValue();
            String label = stmt.getObject().stringValue();
            String predicate = stmt.getPredicate().stringValue();
            indexEntity(id, label, predicate, indexWriter);
        }
    }

    indexWriter.close();
}

private void indexEntity(String aId, String aLabel, String aPredictate,
    IndexWriter aIndexWriter)
{
    try {
        String FIELD_ID = "id";
        String FIELD_CONTENT = "label";
        Document doc = new Document();
        doc.add(new StringField(FIELD_ID, aId, Field.Store.YES));
        doc.add(new StringField(FIELD_CONTENT, aLabel, Field.Store.YES));
        aIndexWriter.addDocument(doc);
        aIndexWriter.commit();

        log.info("Entity indexed with id [{}] and label [{}], predicate [{}]",
            aId, aLabel, aPredictate);
    }
    catch (IOException e) {
        log.error("Could not index entity with id [{}] and label [{}]", aId, aLabel);
    }
}

1 Ответ

0 голосов
/ 09 октября 2018

Вы должны использовать синтаксис запроса Lucene. Ищите c* вместо того, чтобы c. Смотри http://www.lucenetutorial.com/lucene-query-syntax.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...