2013-07-30 2 views
1

최대 절전 모드 검색으로 포함 된 텍스트 엔터티의 인덱싱에 몇 가지 문제가 있습니다. 엔티티는 변경할 수없는 다른 엔티티를 확장하므로 주석을 사용하는 것은 불가능합니다.최대 절전 모드 검색 인덱스 포함 된 맵

따라서 프로그래밍 API를 사용하여 매핑을 수행합니다. 그러나 Hibernate 검색은 삽입 된 텍스트 엔티티를 색인화하지 않습니다. '

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(); 

문서의 ISN :

@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; 
} 

그리고 여기 매핑의 발췌 한 것입니다 : 여기

은 (편의상 벗었) 엔티티 모델이 어떻게 생겼는지에 대한 간단한 예입니다 .indexEmbedded().entity(...)을 사용하는 것에 대해 상당히 명확하지만, 비슷한 매핑을 사용하여 색인화 된 다른 임베디드 엔티티 (다 대일 연관)가 있습니다.

지도가 사용 중이며 Hibernate Search가 속성을지도로 식별 할 수 없기 때문에 텍스트가 매핑되지 않은 것으로 생각됩니다. MapBrigdeBuildInMapBridge이 있지만 매핑을 만들 때 사용하지 않는 것 같습니다.

누락되었거나 오류가있는 위치는 어디입니까?

Btw, 나는 이것을 Hibernate Search 4.0.1과 Hibernate 4.0.1 환경에서한다.

답변

1

나는 해결책을 찾은 것 같습니다. 문서화가 명확하지 않은 것 같기 때문에 다른 사람들이 찾을 수 있도록 여기에 추가 할 것입니다.

텍스트에 대한 참조가 수퍼 클래스 Article의 필드이고 따라서 SpecialArticle이 매핑 될 때 문제가있는 것으로 보입니다. 최대 절전 모드 검색은 어려움이있는 것 같습니다.

가 작동하게하려면

은 매핑뿐만 아니라 슈퍼 클래스를 포함하도록 변경해야했다 : 이상한 무엇

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()에 있다는 것입니다).

관련 문제