Can you use a BooleanFilter (or ChainedFilter in 4.x) alongside your BooleanQuery? Seems more logical and I suspect would solve the problem. Caching filters can be good too, depending on how often your data changes. See CachingWrapperFilter.
-- Ian. On Tue, Mar 10, 2015 at 12:45 PM, Chris Bamford <cbamf...@mimecast.com> wrote: > > 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 m: +44 7860 405292 w: www.mimecast.com Senior Developer p: > +44 207 847 8700 Address click here > <http://www.mimecast.com/About-us/Contact-us/> > ------------------------------ > [image: http://www.mimecast.com] > <https://serviceA.mimecast.com/mimecast/click?account=C1A1&code=83be674748892bc34425eb4133af3e68> > [image: LinkedIn] > <https://serviceA.mimecast.com/mimecast/click?account=C1A1&code=83a78f78bdfa40c471501ae0b813a68f> > [image: > YouTube] > <https://serviceA.mimecast.com/mimecast/click?account=C1A1&code=ad1ed1af5bb9cf9dc965267ed43faff0> > [image: > Facebook] > <https://serviceA.mimecast.com/mimecast/click?account=C1A1&code=172d4ea57e4a4673452098ba62badace> > [image: > Blog] > <https://serviceA.mimecast.com/mimecast/click?account=C1A1&code=871b30b627b3263b9ae2a8f37b0de5ff> > [image: > Twitter] > <https://serviceA.mimecast.com/mimecast/click?account=C1A1&code=cc3a825e202ee26a108f3ef8a1dc3c6f> > >