Unable to create lucene index

From Foochal

Jump to: navigation, search


I was using hibernate lucene integration and kept getting the follow error.

org.hibernate.HibernateException: java.io.FileNotFoundException: C:\lucene-indexes\com.ecommendation.persistence.ECommendationTO\segments (The system cannot find the file specified)
	at org.hibernate.lucene.event.LuceneEventListener.remove(LuceneEventListener.java:147)
	at org.hibernate.lucene.event.LuceneEventListener.onPostDelete(LuceneEventListener.java:112)
	at org.hibernate.action.EntityDeleteAction.postCommitDelete(EntityDeleteAction.java:131)
	at org.hibernate.action.EntityDeleteAction.afterTransactionCompletion(EntityDeleteAction.java:147)
	at org.hibernate.engine.ActionQueue.afterTransactionCompletion(ActionQueue.java:170)
	at org.hibernate.impl.SessionImpl.afterTransactionCompletion(SessionImpl.java:424)
	at org.hibernate.jdbc.JDBCContext.afterTransactionCompletion(JDBCContext.java:225)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:119)
	at com.ecommendation.persistence.ECommendationDao.delete(ECommendationDao.java:124)
	at com.ecommendation.persistence.ECommendationDaoTest.testSave(ECommendationDaoTest.java:95)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
	at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
	at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
	at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
	at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
	at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
	at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
	at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
	at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
	at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.io.FileNotFoundException: C:\lucene-indexes\com.ecommendation.persistence.ECommendationTO\segments (The system cannot find the file specified)
	at java.io.RandomAccessFile.open(Native Method)
	at java.io.RandomAccessFile.<init>(RandomAccessFile.java:212)
	at org.apache.lucene.store.FSIndexInput$Descriptor.<init>(FSDirectory.java:430)
	at org.apache.lucene.store.FSIndexInput.<init>(FSDirectory.java:439)
	at org.apache.lucene.store.FSDirectory.openInput(FSDirectory.java:329)
	at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:45)
	at org.apache.lucene.index.IndexReader$1.doBody(IndexReader.java:146)
	at org.apache.lucene.store.Lock$With.run(Lock.java:99)
	at org.apache.lucene.index.IndexReader.open(IndexReader.java:141)
	at org.apache.lucene.index.IndexReader.open(IndexReader.java:136)
	at org.hibernate.lucene.event.LuceneEventListener.remove(LuceneEventListener.java:142)

The fix was simple. Delete the index directory for the entity and re-run the program. Lucene hibernate listener recreates the index directory for the entity only if it is not present. So you should not create the directory manually (which is unfortunately what I did in the first place). The reason behind the error is that hibernate lucene listener (3.2.0. GA) assumes that the directory was created during initialization time and does calls the index writer with create=false.


Personal tools