Вопрос

Я только начал интегрировать 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 минут.Правильно ли я это делаю?

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

Это было полезно?

Решение

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

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

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

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

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

@Indexed(index = "fulltext")

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

Поэтому вам не следует ни запускать индексацию вручную при сохранении, ни перезапускать индексацию при запуске приложения, если только у вас нет объектов, которые были сохранены до включения индексации.

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

Hibernate Search и автономное извлечение текста

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

Другие советы

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

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

--Харди

В настоящее время я использую автоматическое индексирование 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top