簡體   English   中英

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

[英]Lucene index not updated with Hibernate Search and 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;
}

當我在索引器( org.hibernate.search.MassIndexer startAndWait()上顯式調用startAndWait()時,一切都在索引中按預期進行。 它包含字段namedescriptiondocuments.componentNamedocuments.manufacturer.name

但是,當我現在通過調用Spring Data CrudRepository類的@RestController類進行更新時, 在更改Datasheet直接字段 (例如名稱或描述)時,索引才會更改。 將某些內容更改為DatasheetDocument實例不會更新索引。 知道為什么會這樣嗎?

請注意,我嘗試將反向引用添加到父級。 對於DatasheetDocument

@ManyToOne
@ContainedIn
private Datasheet m_datasheet;

對於Manufacturer

@ManyToMany
@ContainedIn
private Set<DatasheetDocument> m_datasheetDocuments;

但這無濟於事。

我正在使用包含Hibernate 4.3.1的Spring Boot 1.0.1。 我添加了Hibernate Search 4.5.1。 我看到Lucense 3.6.2也被添加為可傳遞的。

您肯定需要后面的參考。 如果沒有它們,尤其是沒有@ContainedIn ,則沒有方法讓Search知道必須在DatasheetDocumentDocument實例更改時更新Database索引。

您是否已將mappedBy添加到一對多邊

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

另外,如何更新DatasheetDocumentDocument 你能顯示代碼嗎? 無論哪種方式,您都需要使關聯成為雙向關聯。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM