2010-05-30 5 views
0

왜 DuplicateFilter가 다른 필터와 함께 작동하지 않습니까? 예를 들어, 테스트 DuplicateFilterTest 약간 개작이 필터는 다른 필터와 제 트림 결과에인가되지 않도록 다음 노출 경우 :Lucene DuplicateFilter 질문

public void testKeepsLastFilter() 
      throws Throwable { 
     DuplicateFilter df = new DuplicateFilter(KEY_FIELD); 
     df.setKeepMode(DuplicateFilter.KM_USE_LAST_OCCURRENCE); 

     Query q = new ConstantScoreQuery(new ChainedFilter(new Filter[]{ 
       new QueryWrapperFilter(tq), 
       // new QueryWrapperFilter(new TermQuery(new Term("text", "out"))), // works right, it is the last document. 
       new QueryWrapperFilter(new TermQuery(new Term("text", "now"))) // why it doesn't work? It is the third document, but hits count is 0. 

     }, ChainedFilter.AND)); 

     // this varians doesn't hit too: 
     // ScoreDoc[] hits = searcher.search(new FilteredQuery(tq, df), new QueryWrapperFilter(new TermQuery(new Term("text", "now"))), 1000).scoreDocs; 
     // ScoreDoc[] hits = searcher.search(new FilteredQuery(tq, new QueryWrapperFilter(new TermQuery(new Term("text", "now")))), df, 1000).scoreDocs; 

     ScoreDoc[] hits = searcher.search(q, df, 1000).scoreDocs; 

     assertTrue("Filtered searching should have found some matches", hits.length > 0); 
     for (int i = 0; i < hits.length; i++) { 
      Document d = searcher.doc(hits[i].doc); 
      String url = d.get(KEY_FIELD); 
      TermDocs td = reader.termDocs(new Term(KEY_FIELD, url)); 
      int lastDoc = 0; 
      while (td.next()) { 
       lastDoc = td.doc(); 
      } 
      assertEquals("Duplicate urls should return last doc", lastDoc, hits[i].doc); 
     } 
    } 

답변

2

DuplicateFilter 독립적 처음 또는 마지막 하나를 선택하는 필터를 구성 각 키를 포함하는 모든 문서의 출현. 최소한의 메모리 오버 헤드로 캐시 될 수 있습니다.

두 번째 필터는 독립적으로 다른 문서를 선택합니다. 두 가지 선택 사항이 일치하지 않을 수 있습니다. 모든 문서의 임의의 일부 하위 집합에 따라 중복을 필터링하려면 필드 캐시를 사용하여 성능을 높이고 RAM 비싸게 처리해야합니다.