2011-08-25 3 views
1

@ IndexedEmbedded을 사용하여 일대 다 연관 관계가있는 포함 된 컬렉션 (집합)을 인덱싱하려고합니다. 문제는 우리가 응용 프로그램에서 레코드를 부드럽게 삭제한다는 것입니다. 인덱싱하는 동안 논리적으로 삭제 된 레코드를 제외하기 위해 인덱스 된 컬렉션에 최대 절전 모드 필터를 적용하려고합니다. 인덱싱최대 절전 모드 검색을 통해 인덱싱하는 동안 최대 절전 모드 필터가 작동하지 않음

@Index 
Class A { 

@IndexedEmbedded 
@OneToMany(targetEntity = B.class, fetch = FetchType.EAGER) 
@Filter(name = "deletedRecordsFilter") 
Set<B> setOfBs; 

} 

: 나는 session.enableFilter ("deletedFilterRecords")를 사용하여 필터를 활성화 한

  FullTextSession fts = getFullTextSession(); 
      fts.createIndexer(entityClass) 
      .purgeAllOnStart(true) 
      .optimizeAfterPurge(true) 
      .optimizeOnFinish(true) 
      .batchSizeToLoadObjects(30) 
      .threadsForSubsequentFetching(8) 
      .threadsToLoadObjects(4) 
      .threadsForIndexWriter(3) 
      .startAndWait(); 

. 데이터가 인덱싱되었지만 필터가 제대로 작동하지 않습니다. 포함 된 컬렉션에는 여전히 삭제 된 레코드가 포함됩니다.

최대 절전 모드 검색을 통해 인덱싱하는 동안 최대 절전 모드 필터가 작동하지 않습니까? 인덱싱 중에 필터가 작동하지 않으면 논리적으로 삭제 된 레코드를 인덱싱하지 않기 위해 어떤 방법이 있습니까?

답변

1

표준 최대 절전 모드 필터가 아닌 FullTextFilter를 사용해야합니다. 나는 현재 작업하고있는 프로젝트에서 하나를 사용했다. 당신은 당신의 인덱스 클래스의 정의 위의 아래와 같은 주석을 추가

@Indexed 
@Entity 
@FullTextFilterDefs({ 
    @FullTextFilterDef(name = "includeInSearchFilter", impl = IncludeInSearchFilterFactory.class, 
      cache = FilterCacheModeType.INSTANCE_AND_DOCIDSETRESULTS) 
}) 
public class SomeEntity ... 
그런 다음,뿐만 아니라이 같은 참조 팩토리 클래스를 제공 할 필요가

: 내 경우에는

public class IncludeInSearchFilterFactory { 

    private String includeInSearchResults; 

    public void setIncludeInSearchResults(String includeInSearchResults) { 
     this.includeInSearchResults = includeInSearchResults; 
    } 

    @Key 
    public FilterKey getKey() { 
     StandardFilterKey key = new StandardFilterKey(); 
     key.addParameter(includeInSearchResults); 
     return key; 
    } 

    @Factory 
    public Filter getFilter() { 
     Query query = new TermQuery(new Term("includeInSearchResults", includeInSearchResults)); 
     return new QueryWrapperFilter(query); 
    } 
} 

을 " includeInSearchResults "구성원은 개체가 내 검색에 의해 반환되기를 원하면 true로 설정된 엔터티의 인덱싱 된 필드였습니다. 그렇지 않으면 false로 설정되었습니다.

fullTextQuery.enableFullTextFilter("includeInSearchFilter").setParameter("includeInSearchResults", "true"); 
:

전체 텍스트 필터를 사용하려면