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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucene索引未使用Hibernate Search和Spring Data进行更新相关的知识,希望对你有一定的参考价值。

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

答案

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

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

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

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

另一答案
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.openSession()

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

以上是关于Lucene索引未使用Hibernate Search和Spring Data进行更新的主要内容,如果未能解决你的问题,请参考以下文章

如何对用 lucene 索引的文档进行分类

maven h2 lucene 类未找到

Hibernate Search 手动索引抛出“org.hibernate.TransientObjectException:实例未与此会话关联”

如何使用gradle获取Hibernate Search Lucene的所有依赖项?

2018-8-25未命名文件

我遇到了使用 spring-boot 2.0.2.RELEASE 进行 Hibernate/lucene 搜索的问题