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