Hibernate Search 4.1 CR1: 软删除

发布者:    |       Hibernate Search

Hibernate Search 是一个库,它通过自动索引实体,将 Hibernate ORM 与 Apache Lucene 或 Elasticsearch 集成,从而实现高级搜索功能:全文搜索、地理空间搜索、聚合等。有关更多信息,请参阅 hibernate.org 上的 Hibernate Search。

希望这次发布将是 Hibernate Search 4.1 最终版之前的最后一次。如果您想提供反馈,现在就是时候了 :) 我们同时发布 Hibernate Search 3.4.2 作为一个小型错误修复版本。

这次候选版本的主要改进是拦截索引操作并对其进行更改的能力。在我们团队中,我们称之为“软删除”功能,即使它可以做更多的事情。乍一看,这似乎是一个原始的功能,但它可以实现许多有趣的使用场景。

索引拦截

在某些情况下,您可能不想索引所有实体(特定类型的实体)。例如,我想在我读者处于“已发布”状态时搜索我的博客条目。如果它们处于“草案”状态,它们不应出现在结果中。当然,为了做到这一点,您可以使用布尔查询限制,或者更好的是声明式过滤器。尽管如此,这些“草案”博客仍然被索引。如果大多数实体不应可搜索,情况就更加严重。例如,存档模式下不应可搜索的发票。

索引拦截让您决定一个实体是否值得被索引。主要好处有

  • 运行时工作减少:无需桥接转换,无需分析阶段,也无需在索引中写入
  • 更小且更易于管理的索引:较小的索引使查询更快,更适合内存,且更容易备份和复制

那么,我该如何做到这一点呢?

  • 编写一个EntityIndexingInterceptor
  • 使用@Indexed.interceptor
/**
 * Only index blog when it is in published state
 *
 * @author Emmanuel Bernard <emmanuel@hibernate.org>
 */
public class IndexWhenPublishedInterceptor implements EntityIndexingInterceptor<Blog> {
    @Override
    public IndexingOverride onAdd(Blog entity) {
        if (entity.getStatus() == BlogStatus.PUBLISHED) {
            return IndexingOverride.APPLY_DEFAULT;
        }
        return IndexingOverride.SKIP;
    }

    @Override
    public IndexingOverride onUpdate(Blog entity) {
        if (entity.getStatus() == BlogStatus.PUBLISHED) {
            return IndexingOverride.UPDATE;
        }
        return IndexingOverride.REMOVE;
    }

    @Override
    public IndexingOverride onDelete(Blog entity) {
        return IndexingOverride.APPLY_DEFAULT;
    }

    @Override
    public IndexingOverride onCollectionUpdate(Blog entity) {
        return onUpdate(entity);
    }
}
@Entity
@Indexed(interceptor=IndexWhenPublishedInterceptor.class)
public class Blog {
    @Id
    @GeneratedValue
    public Integer getId() { return id; }
    public void setId(Integer id) {  this.id = id; }
    private Integer id;

    @Field
    public String getTitle() { return title; }
    public void setTitle(String title) {  this.title = title; }
    private String title;

    public BlogStatus getStatus() { return status; }
    public void setStatus(BlogStatus status) {  this.status = status; }
    private BlogStatus status;

    [...]
}

标记实体为被拦截查看IndexWhenPublishedInterceptor

,您将看到我们只有在实体处于“已发布”状态时才索引该实体,否则跳过或将其从索引中删除。

此功能仍然是实验性的,因为我们可能会根据您的反馈添加更多转换。

这个版本(希望)是4.1系列中4.1最终版之前的最后一个版本。试试看吧

Hibernate Search 3.4.2

这个版本修复了一些特定的问题,特别是关于集合索引的回归问题。感谢Guillaume Smet的贡献。我们鼓励仍停留在3.4系列的用户升级。您可以在SourceForge上获取发布版本,并在接下来的几个小时或几天内应该在我们的Maven仓库中可用。


返回顶部