希望这次发布将是 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最终版之前的最后一个版本。试试看吧
- 下载发布版本或通过Maven获取
- 查看用户论坛
- 在JIRA上报告问题
- 在GitHub上获取源代码,欢迎pull requests :)
Hibernate Search 3.4.2
这个版本修复了一些特定的问题,特别是关于集合索引的回归问题。感谢Guillaume Smet的贡献。我们鼓励仍停留在3.4系列的用户升级。您可以在SourceForge上获取发布版本,并在接下来的几个小时或几天内应该在我们的Maven仓库中可用。