2014-09-11 100 views
2

我有一個實體documentid如何映射Lucene的documentid休眠搜索實體領域

@Indexed 
@Analyzer(impl = EnglishAnalyzer.class) 
@Entity 
@Table(name = "Tag", schema = "cpsc") 
public class Tag extends BaseObject { 

public static final String NAME_FIELD = "name"; 

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "uuidGenerator") 
@GenericGenerator(name = "uuidGenerator", strategy = "mypackage.UuidGenerator") 
@Column(name = ID_FIELD) 
@DocumentId 
private Long id; 

...

我的發電機將創建一個獨特的長ID,並將其存儲到數據庫中保存後。

但是我怎樣才能得到documentid在lucene或設置是一樣的我的實體ID? 使用lucene文檔ID獲取字段將非常有用。

我需要它的主要原因是從實體的索引獲取術語,因爲我需要lucene id。 也許有另一種方式來獲得條款hibernate-search方式?

感謝您的任何建議。

回答

1

這裏有幾件事。首先,您不必指定@Id以及@DocumentId。當您未指定@DocumentId時,JPA標識會自動作爲文檔標識。如果你想明確地使用不同的字段作爲Lucene文檔ID,那麼使用@DocumentId確實是唯一有意義的。

要回答你的問題 - 「但是我怎麼能在lucene中獲取documentid或設置與我的實體ID相同」 - 它們已經是相同的了。並且已經有一個文檔ID字段,您可以通過投影來檢索。使用的投影常數是FullTextQuery.DOCUMENT_ID。另見http://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#projections

+1

爲了增加優秀的答案,我們不要混淆Hibernate Search使用的「文檔ID」,以便用Lucene內部使用的「docId」來標識與存儲在數據庫中的實體的關係。 Lucene docId只是相對於段(或完整索引)的序數,並且在寫入後可能會改變。例如,特定的匹配可能是索引中的第五個條目,然後在插入另一個文檔時成爲第六個條目。使用Projection可以讀取該值,但請記住讀取值將會改變。使用FullTextQuery.ID作爲穩定的參考。 – Sanne 2014-09-16 11:07:06