Hibernate搜索索引嵌入式地图

时间:2013-07-30 13:51:39

标签: java hibernate-search

我在使用Hibernate搜索索引嵌入式文本实体时遇到了一些问题。 由于实体扩展了我无法更改的其他实体,因此使用注释是不可行的。

因此,我使用程序化API进行映射。但是,Hibernate搜索不会对嵌入的文本实体建立索引。

以下是实体模型的简短示例(为简单起见而简化):

@Entity
class Article {
  @Id
  private long uid; 

  private String articleNumber;

  @OneToMany ( mappedBy = "article" )
  @MapKey( name = "languageCode" )
  private Map<String, ArticleText> texts;
  ...
}

@Entity
class ArticleText {
  @ManyToOne
  private ArticleEntity article;      

  private String languageCode;
  private String someText;
  ...
}

@Entity
class SpecialArticle extends Article {
  private String someSpecialAttribute;
}

以下是地图的摘录:

SearchMapping mapping = ...;
mapping.entity( SpecialArticle.class )
 .indexed()
   .property( "uid", ElementType.FIELD ).documentId()
   .property( "articleNumber", ElementType.FIELD ).field()
   .property( "someSpecialAttribute", ElementType.FIELD ).field()
   .property( "texts", ElementType.FIELD )
     .indexEmbedded().targetElement( ArticleText.class ).entity( ArticleText.class )        
       .property( "article", ElementType.FIELD ).containedIn()
       .property( "someText", ElementType.FIELD ).field();

关于使用.indexEmbedded().entity(...)的文档不是很清楚,但我有另一个嵌入式实体(多对一关联),它只使用类似的映射进行索引。

我怀疑由于使用了地图而Hibernate Search无法将该属性标识为地图,因此未映射文本。有MapBrigdeBuildInMapBridge,但在构建映射时似乎没有使用它们。

我可能缺少什么或错误在哪里?

顺便说一句,我在Hibernate Search 4.0.1和Hibernate 4.0.1环境中这样做。

1 个答案:

答案 0 :(得分:2)

好像我找到了解决方案。由于文档似乎并不清楚,我将在此处添加以供其他人查找。

问题似乎是对文本的引用是超类Article的一个字段,因此当映射SpecialArticle时,Hibernate Search似乎有困难。

为了使它工作,必须改变映射以包括超类:

SearchMapping mapping = ...;
mapping.entity( SpecialArticle.class )
 .indexed()
   .property( "uid", ElementType.FIELD ).documentId()   
   .property( "someSpecialAttribute", ElementType.FIELD ).field();

//Map the super class directly, but don't call "indexed()"
mapping.entity( Article.class )
 .property( "articleNumber", ElementType.FIELD ).field()
   .property( "texts", ElementType.FIELD )
     .indexEmbedded().targetElement( ArticleText.class ).entity( ArticleText.class )        
       .property( "article", ElementType.FIELD ).containedIn()
       .property( "someText", ElementType.FIELD ).field();

奇怪的是,问题也发生在articleNumber但不会发生在uid上(可能是因为documentId())。