![](/img/trans.png)
[英]Spring JPA + Hibernate Search : How update the Search Index(Lucene) only?
[英]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()
時,一切都在索引中按預期進行。 它包含字段name
, description
, documents.componentName
和documents.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.