2011-03-19 4 views
1

NHibernate.SearchLucene.Net을 사용 중입니다. 나는 비슷한 문제를 경험 한 사람이 있는지 물어볼 것이다. 이것은 다음의 세 가지 수업에 관한 상황입니다.IndexEmbedded의 하위 클래스 필드 색인화

[Indexed] 
public class File 
{ 
    [Field] 
    public virtual string FileId { get; private set; } 

    [ContainedIn] 
    public virtual List<Record> Records { get; private set; } 
} 

[Indexed] 
public class CaseFile : File 
{ 
    [Field] 
    public virtual int CaseYear { get; set; } 
    [Field] 
    public virtual int CaseSequenceNumber { get; set; } 
} 

[Indexed] 
public class Record 
{ 
    [IndexedEmbedded] 
    public virtual File ParentFile { get; set; } 
} 

문제는 레코드 클래스를 인덱싱하려고 할 때입니다. 목표는 File 클래스와 서브 클래스 CaseFile의 모든 필드를 Record 색인에 포함시키는 것입니다. 그러나 Record 클래스의 색인을 생성 할 때 내 기록 색인에있는 File 수퍼 클래스 필드 만 가져옵니다. 레코드 인덱스에 CaseFile 하위 클래스의 필드가 누락되었습니다.

나는 또한 Record 클래스의 ParentFile 특성에 [IndexedEmbedded(TargetElement = typeof(CaseFile))]을 시도했다, 그러나 이것은 완전히 빈 인덱스, 또는 전혀 색인에 연결됩니다.

File 클래스를 인덱싱하는 경우 예상 하위 클래스 속성은 File 인덱스에서 예상대로 인덱싱됩니다.

누구나 Hibernate/NHibernate과 (과) 비슷한 문제가 발생 했습니까?

답변

1

나는 Hibernate/NHibernate 검색에 관한 문제를 논의했고 그 상황이 버그라는 것을 확인했다.

그들은 내가 될 그것을 원하는 인덱스에 누락 된 필드를 추가 할 사용자 정의 클래스 다리를 사용하는 것이 좋습니다

.

이 훨씬 깨끗하고 있었고, 난 검색이 최대 절전 모드/NHibernate에의 소스까지이 soluion이 만족스러운했다 결정된.

1

동일한 문제가 발생하여 다음과 비슷한 방법으로 해결 방법을 얻을 수있었습니다.

하지만 가장 좋은 해결책은 아닙니다.

[Indexed] 
public class File 
{ 
    [Field] 
    public virtual string FileId { get; private set; } 

    [ContainedIn] 
    public virtual List<Record> Records { get; private set; } 


    [Field(Index.Tokenized, Store = Store.Yes)] 
    public virtual string CaseYearSearch 
    { 
     get 
     { 
      if(GetType() == typeof(CaseFile)) 
      { 
       return ((CaseFile)this).CaseYear; 
      } 
      return ""; 
     } 
    } 

    [Field(Index.Tokenized, Store = Store.Yes)] 
    public virtual string CaseSequenceNumberSearch 
    { 
     get 
     { 
      if(GetType() == typeof(CaseFile)) 
      { 
       return ((CaseFile)this).CaseSequenceNumber; 
      } 
      return ""; 
     } 
    } 
} 

public class CaseFile : File 
{ 
    public virtual int CaseYear { get; set; } 
    public virtual int CaseSequenceNumber { get; set; } 
} 

[Indexed] 
public class Record 
{ 
    [IndexedEmbedded] 
    public virtual File ParentFile { get; set; } 
} 

나는 MultiFieldQueryParser를 사용하여 쿼리합니다.

깨끗한 해결책을 찾으면 알려주세요.