Lucene DuplicateFilter вопрос - PullRequest
0 голосов
/ 31 мая 2010

Почему DuplicateFilter не работает вместе с другими фильтрами? Например, если немного переделать тест DuplicateFilterTest , то создается впечатление, что фильтр не применяется к другим фильтрам, и результаты первого уравнивания:

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

1 Ответ

2 голосов
/ 21 сентября 2010

DuplicateFilter независимо создает фильтр, который выбирает первое или последнее вхождение всех документов, содержащих каждый ключ. Это может быть кэшировано с минимальными затратами памяти.

Ваш второй фильтр самостоятельно выбирает некоторые другие документы. Два варианта могут не совпадать. Чтобы отфильтровать дубликаты по некоторому произвольному подмножеству всех документов, вероятно, потребуется использовать кэш полей, чтобы быть быстродействующим, и именно здесь все становится дороже с точки зрения памяти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...