Индексирование данных в Hibernate Search - PullRequest
4 голосов
/ 01 июня 2009

Я только начал интегрировать Hibernate Search с моим приложением Hibernate. Данные индексируются с помощью Hibernate Session каждый раз, когда я запускаю сервер.

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     

Это очень неудобно, и запуск сервера занимает 10 минут. Я делаю это правильно?

Я написал планировщик, который будет периодически обновлять индексы. Будет ли это автоматически обновлять существующие записи индекса или создавать дубликаты индексов?

Ответы [ 3 ]

10 голосов
/ 17 сентября 2009

Как подробно описано в руководстве по Hibernate Search, раздел 3.6.1, если вы используете аннотации (теперь по умолчанию), слушатели, запускающие индексацию в хранилище, регистрируются по умолчанию:

Поиск Hibernate включен из окно при использовании аннотаций Hibernate или Hibernate EntityManager. Если для по какой-то причине вам нужно отключить его, задавать hibernate.search.autoregister_listeners в ложь.

Пример того, как включить их вручную:

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

Все, что вам нужно сделать, это пометить сущности, которые вы хотите проиндексировать, с помощью

@Indexed(index = "fulltext")

аннотации, а затем выполните детальную аннотацию полей, как подробно описано в руководстве пользователя.

Таким образом, вы не должны ни запускать индексацию вручную при хранении, ни повторно запускать индексацию при запуске приложения, если у вас нет сущностей, которые были сохранены до того, как индексация была включена.

У вас могут возникнуть проблемы с производительностью, когда вы сохраняете объект, который имеет «вложение», и поэтому вы индексируете его в той же области транзакции, в которой хранится объект. Смотрите здесь:

Поиск в спящем режиме и извлечение текста в автономном режиме

для решения, которое решает эту проблему.

1 голос
/ 02 июня 2009

При условии, что вы используете FSDirectoryProvider (который используется по умолчанию), индекс Lucene сохраняется на диске. Это означает, что нет необходимости индексировать при самом запуске. Если у вас есть существующая база данных, вы, конечно, хотите создать начальный индекс, используя функцию fullTextSession.index (). Тем не менее, это не должно быть при запуске приложения. Подумайте об открытии какого-либо URL-адреса триггера или интерфейса администратора. Если у вас есть начальный индекс, я бы рекомендовал использовать автоматическую индексацию. Это означает, что индекс Lucene автоматически обновляется, если книги создаются / обновляются / удаляются. Автоматическая индексация также должна быть включена по умолчанию.

Я рекомендую обратиться к разделам автоматической и ручной индексации в онлайн-руководстве - http://docs.jboss.org/hibernate/stable/search/reference/en/html_single

- Hardy

0 голосов
/ 10 февраля 2011

В настоящее время я использую автоматическую индексацию Hibernate Search с помощью JPA, и она работает очень хорошо. Для первоначального создания индексов вы можете просто позвонить по следующему номеру:

    FullTextEntityManager fullTextEntityManager = 
                    Search.getFullTextEntityManager(entityManager);

    try {
       fullTextEntityManager.createIndexer().startAndWait();
    } catch (InterruptedException e) {
       // Exception handling
    }

где «entityManager» - это просто javax.persistence.EntityManager. Выше будет индексировать все поля, помеченные @Field для всех сущностей, помеченных как @ Indexed.

Затем, пока вы делаете все свои обновления и т. Д., Через менеджер сущностей, индексы автоматически обновляются. Затем вы можете выполнять поиск в обычном режиме, но при каждом поиске обязательно обновляйте свой EntityManager (для этого можно использовать EntityManagerFactory).

...