我正在运行一个使用休眠搜索在系统中查找人员的应用程序。我在 JBoss AS 7.1.1 上运行它,应用程序基于 Seam 3、Weld 和 JSF 2.1。它运行顺利,但经过一些较高的负载后,使用 的页面FullTextEntityManager
加载速度非常慢。在某些时候,整个应用程序正在减速。
所以我想到也许我错误地使用了 Hibernate 搜索。我正在使用启动单例来索引数据库:
@Singleton
@Startup
public class Initializer implements Serializable {
private static final long serialVersionUID = 1L;
@PersistenceContext
private EntityManager entityManager;
@PostConstruct
public void startup() throws Exception {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();
}
}
然后我FullTextEntityManager
在 PrimeFaces 的自动完成组件中使用的方法中使用:
@Session Scoped
public class ... {
private QueryBuilder queryBuilder;
@Inject
private EntityManager entityManager;
@PostConstruct
public void initFulltext() {
fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(entityManager);
queryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Person.class).get();
}
@Override
@SuppressWarnings("unchecked")
public List<Person> autocomplete(Object event) throws Exception {
if (event.toString() != null && !event.toString().trim().isEmpty()) {
org.apache.lucene.search.Query query = queryBuilder.keyword()
.onFields("username", "firstname", "lastname").matching(event.toString())
.createQuery();
FullTextQuery persistenceQuery = fullTextEntityManager.createFullTextQuery(query, Person.class);
persistenceQuery.setMaxResults(MAX_RESULTS_ON_PAGE);
return persistenceQuery.getResultList();
}
return null;
}
}
这是在 Java EE 应用程序中正确使用 Hibernate Search 吗?一段时间后,休眠搜索是否可能会尝试同步实体和Lucene索引的更改?如果是这样,它是否可能对性能造成巨大影响?