2009-06-01 3 views
4

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

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

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

ответ

10

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

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 and offline text extraction

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

+1

Этот ответ, в частности, показывает, что был принят как ответ выше, НЕПРАВИЛЬНО. Если вы храните объект, вы должны НЕ как обычную индексацию запуска процедуры вручную. –

1

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

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

--Hardy

+0

Как включить автоматическое индексирование? Какова конфигурация для того же самого? – Shashi

+0

Если вы используете аннотации Hibernate, автоматическая индексация будет включена по умолчанию. Если вы не используете аннотацию, вам необходимо зарегистрировать FullTextIndexEventListener: http://docs.jboss.org/hibernate/stable/search/reference/en/html_single/#search-configuration-event – Hardy

0

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

+0

Обратите внимание, что это доступно только в Hibernate Search версии 3.2+ (см. [Hibernate Search 3.2: быстрое восстановление индекса] (http://relation.to/13387.lace) –

+0

Будет ли это работать, если ваше приложение db находится в многоквартирном доме ? – KyelJmD

+0

@KyelJmD yes. В приложении, в котором я работаю, используется однодисковое многопользовательское хранилище. Или вы имеете в виду мульти-аренда мульти-DB/multi-schema? Тогда я не уверен, вам придется попробовать – brent777

 Смежные вопросы

  • Нет связанных вопросов^_^