Я использую Hibernate (с JPA) и Hibernate Поиск для моего веб-приложения Spring. При запуске приложения на сервере, я создать индексы с помощью следующего кода:Hibernate Search не индексирует индекс lucene после вставки
EntityManager em = emf.createEntityManager();
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
fullTextEntityManager.createIndexer().startAndWait();
em.close();
Это работает как шарм. Однако, когда я вставляю новые объекты через Hibernate, индексы не изменяются, чтобы содержать новые сущности. Согласно документации Hibernate; это должно произойти автоматически.
Это, как вставить объект:
EntityTransaction tx = null;
EntityManager em = emf.createEntityManager();
try {
tx = em.getTransaction();
tx.begin();
em.persist(account);
em.flush();
tx.commit();
}
catch (RuntimeException e) {
if (tx != null && tx.isActive()) tx.rollback();
return null;
}
И это, как я использую Hibernate Search:
EntityManager em = emf.createEntityManager();
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
em.getTransaction().begin();
QueryBuilder qb = fullTextEntityManager.getSearchFactory()
.buildQueryBuilder().forEntity(AccountPojo.class).get();
org.apache.lucene.search.Query luceneQuery = qb
.keyword()
.onFields("id", "user.email", "user.firstName", "user.lastName", "user.phoneNumber", "user.streetAddress")
.matching(term)
.createQuery();
// wrap Lucene query in a javax.persistence.Query
org.hibernate.search.jpa.FullTextQuery jpaQuery =
fullTextEntityManager.createFullTextQuery(luceneQuery, AccountPojo.class);
jpaQuery.setProjection(FullTextQuery.SCORE, FullTextQuery.THIS, "id", "user.email", "user.firstName", "user.lastName", "user.phoneNumber");
// execute search
List result = jpaQuery.getResultList();
em.getTransaction().commit();
em.close();
return result;
Когда я вставляю счет, это не поиск (индексируется), прежде чем перезапустить приложение. Как я уже сказал, конфигурация выполняется с аннотациями JPA.
Есть ли что-то, что мне не хватает здесь?
Какой у вас менеджер по работе с весной? Я смутно помню, что это деликатная проблема (потому что reindex происходит при совершении транзакции). Я думаю, что это должен быть менеджер транзакций JPA. –
Я использую менеджер транзакций JPA: javax.persistence.EntityTransaction; – MichaelCleverly