Unable to use full text search with oak lucene
Asked Answered
L

0

7

I am trying out jackrabbit oak with lucene in a file node store. The index definition record is created successfully but it seems the index record is not created. The full project I am working on is here

What I am doing in the code is initializa a repository, create the lucene index definition, add a test data with a single property "name" with value "foo". Sleep for 5 second for async indexing to complete, then perform the following query in a retry loop select * from [nt:base] where contains(., 'foo').

No result is returned. I have tried oak-run console to retrieve lc info on oak:index/lucene directory, it displays no result as well.

This is the main part of the code

public static void main( String[] args ) throws Exception
{
    init();
    createLuceneIndex();
    createTestData();
    performQuery();

}

private static void init() throws InvalidFileStoreVersionException, IOException {
    LuceneIndexProvider provider = new LuceneIndexProvider();
    FileStore fs = FileStoreBuilder.fileStoreBuilder(new File("repository")).build();
    nodestore = SegmentNodeStoreBuilders.builder(fs).build();
    repository = new Jcr(new Oak(nodestore))
            .withAsyncIndexing("async", 3)
            .with(new LuceneIndexEditorProvider())
            .with((QueryIndexProvider) provider)
            .with((Observer)provider)
            .withAsyncIndexing()
            .createRepository();
}

private static void createLuceneIndex() throws RepositoryException {
    Session session = createAdminSession();
    Node indexesNode = session.getRootNode().getNode("oak:index");
    IndexDefinitionBuilder idxBuilder = new IndexDefinitionBuilder();
    IndexRule indexRules = idxBuilder.indexRule("nt:unstructured");
    indexRules.sync();
    indexRules.property("name").analyzed().nodeScopeIndex();
    idxBuilder.async("async");
    idxBuilder.includedPaths("/");
    Node documentIndex = indexesNode.addNode("lucene", "oak:QueryIndexDefinition");
    idxBuilder.build(documentIndex);
    session.save();
    session.logout();

}

private static void createTestData() throws LoginException, RepositoryException {
    Session session = createAdminSession();
    Node test = session.getRootNode().addNode("test");
    test.setProperty("name", "foo");
    session.save();
    session.logout();
}

private static void performQuery() throws Exception {
    final Session session = createAdminSession();
    TimeUnit.MICROSECONDS.sleep(5);

    QueryManager qm = session.getWorkspace().getQueryManager();
    final Query q = qm.createQuery("select * from [nt:base] where contains(., 'foo')", Query.JCR_SQL2);

    new RetryLoop(new RetryLoop.Condition() {
        public String getDescription() {
            return "Full text query";
        }

        public boolean isTrue() throws Exception {
            QueryResult r = q.execute();
            return r.getNodes().hasNext();
        }
    }, 20, 500);
}

the pom file dependencies

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>
<dependency>
    <groupId>javax.jcr</groupId>
    <artifactId>jcr</artifactId>
    <version>2.0</version>
</dependency>
<dependency>
    <groupId>org.apache.jackrabbit</groupId>
    <artifactId>oak-jcr</artifactId>
    <version>1.21-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.apache.jackrabbit</groupId>
    <artifactId>oak-core</artifactId>
    <version>1.21-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.apache.jackrabbit</groupId>
    <artifactId>oak-jcr</artifactId>
    <version>1.21-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.apache.jackrabbit</groupId>
    <artifactId>oak-segment-tar</artifactId>
    <version>1.21-SNAPSHOT</version>
</dependency>
    <dependency>
    <groupId>org.apache.jackrabbit</groupId>
    <artifactId>oak-lucene</artifactId>
    <version>1.21-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.30</version>
</dependency>
<dependency>
    <groupId>com.codahale.metrics</groupId>
    <artifactId>metrics-core</artifactId>
    <version>3.0.2</version>
</dependency>
Lalapalooza answered 2/1, 2020 at 5:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.