插入后,Hibernate Search不会重新索引lucene索引

迈克尔·克莱弗利(MichaelCleverly)

我正在使用Spring(与JPA一起使用)和Hibernate Search作为Spring Web应用程序。当应用程序在服务器上启动时,我使用以下代码创建索引:

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注释进行的。

我在这里想念什么吗?

迈克尔·克莱弗利(MichaelCleverly)

事实证明,此答案的解决方案非常简单。在上面的示例中,我正在保存一个帐户,然后尝试通过相关实体(User)上的某些属性对其进行搜索当您保留其中一个查询中包含的具有相关实体的对象时,您需要执行以下操作:

em.refresh(account)

坚持下去之后。否则,将不会重建相关实体的索引,因此您将无法通过实体实体的属性来查找新实体。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Hibernate envers + hibernate-search :通过 Lucene/Elasticsearhc 索引读取审计信息

Hibernate Search:将 Lucene 索引持久化到数据库中

重新打开Lucene索引

在Hibernate Search中索引数据

Hibernate Search索引单个租户

带有 Hibernate Search 的 Spring Boot 2,保存时不会创建索引

编辑后如何编辑datagridview行并将行索引重新插入回datagridview

串联后熊猫重新计算索引

添加新字段后如何重新索引

在Azure搜索中重新索引后的分页

登录后重新访问索引页面

Hibernate Search:用于索引的后台助手

更改一个字段后,Hibernate Search未编制索引

写后优化Lucene索引是否是强制性的?

Elasticsearch:更新索引分析器后,索引需要重新索引吗?

NumPy-在指定索引后插入零数组

SQL Server:合并(插入/更新)后的非聚集索引

如何使用熊猫的重新索引方法“填充”插入数据?

重新插入表记录并更新自动增量主索引

TSQL唯一过滤索引不会阻止插入

重新索引以在多索引数据框中插入丢失的行

LokiJS:插入索引的现有值不会出错-如何制作唯一索引?

分组和重新采样后如何索引数据?

jQuery:删除动态添加的项目后重新索引顺序

熊猫:在分组和重新索引后在行之间进行操作

在Postgres 9.4充满真空后是否需要重新索引

从PostgreSql删除一行后如何重新索引Solr?

Python Pandas:时区转换后重新索引DataFrame

数组索引更改后重新排序元素值