我有一个使用 JSF 2、Spring、JPA 2 和 Hibernate Search 4.5.0 的项目。这个项目非常简单,但 Hibernate Search 给我带来了一些麻烦。
我使用 Hibernate Search 的唯一部分是为 Oracle View 建立索引。如果我运行一个简单的 select count(*) from my_view
,此 View 会给出 5756 条记录,这并不多。
嗯,我做的第一件事是使用 JPA/Hibernate Search 进行实体映射:
@Entity
@Indexed
@Table(name = "my_view")
public class Person implements Serializable {
private static final long serialVersionUID = 244555315052436669L;
@Id
@Column(name = "id", insertable = false, updatable = false)
private Long id;
@Field(store = Store.NO, index = Index.YES, analyze = Analyze.YES)
@Column(name = "name", insertable = false, updatable = false)
private String name;
@Field(store = Store.NO, index = Index.YES, analyze = Analyze.YES)
@Column(name = "email", insertable = false, updatable = false)
private String email;
@Field(store = Store.NO, index = Index.YES, analyze = Analyze.YES)
@Column(name = "user", insertable = false, updatable = false)
private String user;
@Field(store = Store.YES, index = Index.YES, analyze = Analyze.YES)
@Column(name = "phone", insertable = false, updatable = false)
private String phone;
//Getters and Setters ommited
}
映射我的实体后,我构建了一个 cronJob 来索引该实体。看一下我用来索引实体的方法。
public void index() throws DAOException {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(this.entityManager);
try {
fullTextEntityManager.createIndexer(Person.class)
.purgeAllOnStart(Boolean.TRUE)
.optimizeOnFinish(Boolean.TRUE)
.startAndWait();
}
catch (InterruptedException e) {
logger.error("Error creating index", e);
throw new DAOException(e);
}
}
而且,在对我的实体建立索引后,我可以使用一个关键字搜索许多列。 问题是当我尝试在没有任何关键字的情况下进行搜索时!我的应用程序必须返回所有记录。但我想,使用 Hibernate Search,这个搜索会非常快。我的错误!
搜索需要超过 40 秒才能返回!这是我如何不使用术语进行搜索:
FullTextEntityManager fullTextEm = Search.getFullTextEntityManager(this.entityManager);
QueryBuilder qb = fullTextEm.getSearchFactory().buildQueryBuilder().forEntity(Person.class).get();
FullTextQuery fullTextQuery = fullTextEm.createFullTextQuery(qb.all().createQuery());
Sort sortField = new Sort(new SortField("name", SortField.STRING));
fullTextQuery.setSort(sortField);
return fullTextQuery.getResultList();
最佳答案
查询执行可能非常快(因为不使用关键字进行搜索非常有效),但执行的下一步是将所有结果从数据库加载到内存中,而从数据库加载 5000 多个元素永远不会速度要快,除非您研究实体和查询的缓存。
如果您需要加载所有内容,那么这不是全文查询,而是通过标准关系查询更好地执行。 无论查询类型如何(除非您使用投影),您可能还想研究模型导致的加载策略。通常,您可以通过调整某些关系的获取策略和/或启用二级缓存来获得显着的提升。
关于java - 为什么 Hibernate 搜索速度慢?即使记录很少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22619648/