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

问题描述 投票:0回答:2

我正在使用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也被传递过了。

java hibernate lucene hibernate-search spring-boot
2个回答
1
投票

你需要肯定的后面参考。如果没有它们,特别是没有@ContainedIn,搜索就无法知道它必须在DatasheetDocument实例更改时更新数据表索引。

你有没有将mappedBy添加到一对多方面?

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

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


-1
投票
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.openSession()

 Object customer = fullTextSession.load( Datasheet.class, datasheetDocument.getDatasheet.getId() );
fullTextSession.index(customer);
fullTextSession.flushIndex();
© www.soinside.com 2019 - 2024. All rights reserved.