java - 为什么 Hibernate 搜索速度慢?即使记录很少

标签 java hibernate jpa hibernate-search

我有一个使用 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/

相关文章:

java - 从数据库中检索数据并将新数据写入mysql

java - EJB 删除实体不起作用

mysql - 从 SQL 到 HQL 连接和删除

java - 为什么 JPA 实体中的属性不允许使用 "public"?

java - 在 Servlet 中强制浏览器下载 - Spring

java - 您需要数据库事务来读取数据吗?

java - Hibernate 异常 - 初始 SessionFactory 创建失败。java.lang.NoSuchMethodError : javax. persistence.Table.indexes()[Ljavax/persistence/Index;

java - 启用 JPA 静态编织(eclipselink)

java - hibernate 无法在注释方法中指定通用属性标识符

java - setIconImage() 的问题