icehawk
icehawk

Reputation: 1235

How to populate a lucene 5.3 index

I have written the following class to populate a Lucene Index. I want to build an Index for Lucene so that I can query for specific documents. Unfortunately my documents are not added to the index.

Here is my code:

public class LuceneIndexer {
private IndexWriter indexWriter;
private IndexReader indexReader;

    public LuceneIndexer() throws Exception {
        Directory indexDir = FSDirectory.open(Paths.get("./index-directory"));
        IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer());
        config.setCommitOnClose(true);
        config.setOpenMode(OpenMode.CREATE);

        this.indexWriter = new IndexWriter(indexDir, config);
        indexReader = DirectoryReader.open(this.indexWriter, true);
}

    public void indexRelation(String subject, String description, String object) throws IOException {
    System.out.println("Indexing relation between: " + subject+" and "+object);

    Document doc = new Document();
    doc.add(new TextField("subject", subject, Field.Store.YES));
    doc.add(new TextField("description", description, Field.Store.YES));
    doc.add(new TextField("object", object, Field.Store.YES));

    indexWriter.addDocument(doc);
}

public void commit() throws Exception {
        indexWriter.commit();
}

public int getNumberOfRelations() {
    return indexReader.numDocs();
}
}

I am trying to get the following testcase to pass:

public class LuceneIndexerTest {
private LuceneIndexer instance;

@Before
public void setUp() throws SQLException, IOException {
    instance = new LuceneIndexer();
    instance.indexRelation("subject1","descr1","object1");
    instance.indexRelation("subject2","descr2","object2");
    instance.indexRelation("subject3","descr3","object3");
    instance.commit();
}

@After
public void tearDown() throws IOException {
    instance.close();
}

@Test
public void testIndexing() {
    Assert.assertEquals(3, instance.getNumberOfRelations());
    Assert.assertEquals(3, instance.getNumberOfRelations("subject"));
}

Unfortunately the Testcase says there are 0 documents in the index.

Upvotes: 0

Views: 134

Answers (1)

Emmanuel Keller
Emmanuel Keller

Reputation: 3384

From Lucene's javadoc: "Any changes made to the index via IndexWriter will not be visible until a new IndexReader is opened".

The indexReader keep a view on your index at the time the IndexReader object was created. Just create a new one after each commit, and your indexReader will work as expected.

Here is the fix for your LuceneIndexer class:

public void commit() throws Exception {
    indexWriter.commit();
    if (indexReader != null)
        indexReader.close();
    indexReader = DirectoryReader.open(this.indexWriter, true);
}

Upvotes: 1

Related Questions