views:

1027

answers:

3

I just start integrate Hibernate Search with my hibernate application. The data is indexed by using Hibernate Session everytime i start the server.

FullTextSession fullTextSession = Search.getFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();

List books = session.createQuery("from Book as book").list();
for (Book book : books) {
    fullTextSession.index(book);
}

tx.commit(); //index is written at commit time     

It is very much awkward. The server take time of 10 minute to start. Am i doing the things in write way?

I wrote a schedular which will update the indexes periodically. Is that the lucene update the existing column automatically or create a duplicate indexes?

+1  A: 

Ideally, a book should only be indexed when it is saved to the database. You shouldn't have to index any books when the server starts up. I am not terribly familiar with Hibernate's full text facilities, but I would imagine your code would end up looking something like this:

public class BookDAO {

    public void saveBook(Book book) {
        Session session = ...;
        session.save(book);

        FullTextSession fullTextSession = Search.getFullTextSession(session);
        fullTextSession.index(book);
    }

    public void deleteBook(Book book) {
        Session session = ...;
        session.delete(book);

        FullTextSession fullTextSession = Search.getFullTextSession(session);
        fullTextSession.delete(book);
    }

}
Adam Paynter
How to update the index?
Shashi Bhushan
I believe the index itself should be updated every time either the saveBook method or deleteBook method is called. The fullTextSession.index(book) method should update the index, correct? That is what I gathered from your example in the question.
Adam Paynter
A: 

Provided you are using a FSDirectoryProvider (which is the default) the Lucene index is persisted on disk. This means there is no need to index on very startup. If you have existing database you want of course to create an initial index using the fullTextSession.index() functionality. However, this should not be on application startup. Consider exposing some sort of trigger url, or admin interface. Once you have the initial index I would recommend to use automatic indexing. This means that the Lucene index gets automatically updated if a books get created/updated/deleted. Automatic indexing should also be enabled by default.

I recommend you refer to the automatic and manual indexing sections in the online manual - http://docs.jboss.org/hibernate/stable/search/reference/en/html_single

--Hardy

Hardy
How can Automatic indexing be enabled? What is the configuration for the same?
Shashi Bhushan
If you are using Hibernate Annotations automatic indexing will be enabled by default. If you are not using Annotation you have to register the FullTextIndexEventListener:http://docs.jboss.org/hibernate/stable/search/reference/en/html_single/#search-configuration-event
Hardy
+3  A: 

As detailed in the Hibernate Search guide, section 3.6.1, if you are using annotations (by now the default), the listeners which launch indexing on store are registered by default:

Hibernate Search is enabled out of the box when using Hibernate Annotations or Hibernate EntityManager. If, for some reason you need to disable it, set hibernate.search.autoregister_listeners to false.

An example on how to turn them on by hand:

 hibConfiguration.setListener("post-update", new FullTextIndexEventListener());
 hibConfiguration.setListener("post-insert", new FullTextIndexEventListener());
 hibConfiguration.setListener("post-delete", new FullTextIndexEventListener());

All you need to do is annotate the entities which you want to be indexed with the

@Indexed(index = "fulltext")

annotation, and then do the fine-grained annotation on the fields, as detailed in the user guide.

So you should neither launch indexing by hand when storing, neither relaunch indexing whae the application starts, unless you have entities which have been stored before indexing was enabled.

You may get performance problems when you are storing an object which say has an "attachment" and so you are indexing that in the same scope of the transaction which is storing the entity. See here:

Hibernate Search and offline text extraction

for a solution that solves this problem.

Pietro Polsinelli
This answer in particular shows that was has been accepted as answer above is WRONG. You should NOT as a general procedure launch indexing by hand when storing an entity.
Pietro Polsinelli