Hi,

I have an index of 30 docs, 20 of which have an owner field of "UserA" and 10 
of "UserB".
I also have a query which consists of:

BooleanQuery:
-- Clause 1: TermQuery
-- Clause 2: FilteredQuery
----- Branch 1: MatchAllDocsQuery()
----- Branch 2: MyNDVFilter

I execute my search as follows:

searcher.search( booleanQuery,
                                    new TermFilter(new Term("owner", "UserA"),
                                    50);

The TermFilter's job is to reduce the number of searchable documents from 30 to 
20, which it does for all clauses of the BooleanQuery except for MyNDVFilter 
which iterates through the full 30 docs, 10 needlessly.  How can I restrict it 
so it behaves the same as the other query branches?

MyNDVFilter source code:

public class MyNDVFilter extends Filter {

    private String fieldName;
    private String matchTag;

    public TagFilter(String ndvFieldName, String matchTag) {
        this.fieldName = ndvFieldName;
        this.matchTag = matchTag;
    }

    @Override
    public DocIdSet getDocIdSet(AtomicReaderContext context, Bits acceptDocs) 
throws IOException {

        AtomicReader reader = context.reader();
        int maxDoc = reader.maxDoc();
        final FixedBitSet bitSet = new FixedBitSet(maxDoc);
        BinaryDocValues ndv = reader.getBinaryDocValues(fieldName);

        if (ndv != null) {
            for (int i = 0; i < maxDoc; i++) {
                BytesRef br = ndv.get(i);
                if (br.length > 0) {
                    String strval = br.utf8ToString();
                    if (strval.equals(matchTag)) {
                        bitSet.set(i);
                        System.out.println("MyNDVFilter >> " + matchTag + " 
matched " + i + " [" + strval + "]");
                    }
                }
            }
        }

        return new DVDocSetId(bitSet);    // just wraps a FixedBitSet
    }
}

Chris Bamford
Senior Developer
m: +44 7860 405292
p: +44 207 847 8700
w: www.mimecast.com
Address click here: www.mimecast.com/About-us/Contact-us/






Reply via email to