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>
>
>

Reply via email to