Lucene索引未使用Hibernate Search和Spring Data进行更新

时间:2014-04-14 15:04:11

标签: java hibernate lucene hibernate-search spring-boot

我正在使用Spring Boot和Spring Data开始使用Hibernate Search / Lucene,但我遇到的问题是索引没有更新(使用Luke工具检查)。

我的域名中有3个班级。这是Datasheet,我的根实体:

@Entity
@Indexed
public class Datasheet
{

    @Id
    @GeneratedValue()
    private long m_id;

    @Field(name="name")

    private String m_name;

    @Field(name="description")
    private String m_description;

    @IndexedEmbedded(prefix = "documents.")
    @OneToMany(cascade = CascadeType.REMOVE)
    private Set<DatasheetDocument> m_documents;
}

然后DatasheetDocument

@Entity
public class DatasheetDocument
{
    @Id
    @GeneratedValue()
    private long m_id;

    private String m_originalFileName;

    @Field(name="componentName")
    private String m_componentName;

    @IndexedEmbedded(prefix = "manufacturer.")
    @ManyToOne
    private Manufacturer m_manufacturer;
}

最后Manufacturer

@Entity
public class Manufacturer
{
    @Id
    @GeneratedValue()
    private long m_id;

    @Field(name="name", analyze = Analyze.NO)
    private String m_name;

    private String m_website;
}

当我在索引器(startAndWait())上显式调用org.hibernate.search.MassIndexer时,索引中的所有内容都是预期的。它包含字段namedescriptiondocuments.componentNamedocuments.manufacturer.name

但是,当我现在通过调用Spring Data @RestController类的CrudRepository类进行更新时,更改直接字段时,索引会发生更改/ {> Datasheet(例如名称或描述)。将内容更改为DatasheetDocument个实例不会更新索引。知道为什么会这样吗?

请注意,我已尝试向父级添加反向引用。对于DatasheetDocument

@ManyToOne
@ContainedIn
private Datasheet m_datasheet;

对于Manufacturer

@ManyToMany
@ContainedIn
private Set<DatasheetDocument> m_datasheetDocuments;

但这没有用。

我正在使用Spring boot 1.0.1,其中包括Hibernate 4.3.1。我添加了Hibernate Search 4.5.1。我看到Lucense 3.6.2也被传递过了。

2 个答案:

答案 0 :(得分:1)

您确实需要后退参考。没有它们,特别是没有 @ContainedIn ,当 DatasheetDocument 实例更改时,搜索无法知道它必须更新数据表索引

您是否已将 mappedBy 添加到一对多方?

@OneToMany(cascade = CascadeType.REMOVE, mappedBy="m_datasheet")
private Set<DatasheetDocument> m_documents;

另外,如何更新 DatasheetDocument ?你能展示代码吗?无论哪种方式,您都需要开始双向关联。

答案 1 :(得分:-1)

FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.openSession()

 Object customer = fullTextSession.load( Datasheet.class, datasheetDocument.getDatasheet.getId() );
fullTextSession.index(customer);
fullTextSession.flushIndex();