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

Spring JPA + Hibernate Search : How update the Search Index(Lucene) only?

我使用 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;

    .
    .

}

为了说明这个 class,"FeatureMeta" 维护很少更新的元数据信息。

但是,每当用户下载有关此 "feature" 的信息时,字段 "totalDownloads" 会不断变化。 基本上 "totalDownloads" 不是元数据的一部分,但我不得不将此字段放入模型中,因为我需要在 "feature search".[=12= 的搜索结果中显示 "totalDownloads" ]

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

我的问题是;每当对 "totalDownloads" 字段进行更改时,是否可以只更新 Lucene 索引中的 "totalDownloads" 而不是 MySQL 中的实体?

您必须使用@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 索引中生成任何更改,以防实体没有其他更改。