2017-04-03 111 views
0

我使用Spring JPA + Hibernate Search在我的应用程序中实现持久性和搜索。Spring JPA + Hibernate搜索:如何仅更新搜索索引(Lucene)?

我有模特这样

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中的实体吗?

+0

不希望坚持这种下载次数的原因是什么?它存储在其他地方吗?如果是这样,你的元数据和存储这些信息的其他地方是否有关系?如果你没有坚持到任何地方,索引被破坏的那一天(它会*发生),你将无法在“totalDownloads”字段中使用正确的数据重建它们...... –

回答

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索引的任何变化,如果实体有没有其他变化。