2010-05-30 2 views
0

Pourquoi DuplicateFilter ne fonctionne pas avec d'autres filtres? Par exemple, si un petit remake du test DuplicateFilterTest, alors l'impression que le filtre ne soit pas appliquée à d'autres filtres et les premiers résultats des versions:Lucene DuplicateFilter question

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

Répondre

2

DuplicateFilter indépendamment construit un filtre qui choisit soit le premier ou le dernier l'occurrence de tous les documents contenant chaque clé. Cela peut être mis en cache avec un minimum de mémoire.

Votre deuxième filtre sélectionne indépendamment d'autres documents. Les deux choix peuvent ne pas coïncider. Pour filtrer les doublons selon un sous-ensemble arbitraire de tous les docs, il faudrait probablement utiliser un cache de champ pour être performant et c'est là que les choses deviennent chères en RAM