Spring JPA + Hibernate Search:如何更新搜索索引(Lucene)?

时间:2017-04-03 00:55:08

标签: java spring jpa spring-data hibernate-search

我使用Spring JPA + Hibernate Search在我的应用程序中实现持久性和搜索。

我有这样的模特

public class FeatureMeta {

    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column(unique=true)
    private String uri;

    @Column
    @Field
    private String name;

    @Field
    @Column
    private String businessDesc;

    @Field
    @Column
    private String logicalDesc;

    .
    .


    @Field
    @Column(insertable=false,updatable=false)
    private Long totalDownloads;

    .
    .

}

为了提供关于这个类的想法,“FeatureMeta”维护很少更新的元数据信息。

然而,只要用户下载有关此“功能”的信息,“totalDownloads”字段就会不断变化。 基本上“totalDownloads”不是元数据的一部分,但我必须将此字段放在模型中,因为我需要在“特征搜索”的搜索结果中显示“totalDownloads”。

我使用相同的JPA Repository来更新MySQL和Lucene索引。

我的问题是;只要对“totalDownloads”字段进行更改,是否可以仅更新Lucene索引中的“totalDownloads”而不更新MySQL中的实体?

1 个答案:

答案 0 :(得分:1)

您必须使用@Transient注释来标记您不希望此属性成为数据库模型的一部分。

@Field
@Transient
private Long totalDownloads;

使字段瞬态也意味着它不会从数据库加载(Hibernate ORM完全忽略,但Hibernate Search不能忽略);如果这不是你想要的,你可以添加一个额外的字段:将一个映射到Hibernate ORM,另一个用Hibernate Search索引并用@Transient注释。在这种情况下,您必须使setter更新两个字段。

您可能还需要更改此配置属性:

hibernate.search.enable_dirty_check = false

因为如果实体没有其他更改,Hibernate Search将不会在Lucene索引中生成任何更改。