Hello.
Thanks for your replay.

On Tue, Dec 16, 2014 at 3:14 PM, Adrien Grand <jpou...@gmail.com> wrote:
>
> Hi Piotr,
>
> On Mon, Dec 15, 2014 at 9:43 PM, Piotr Idzikowski
> <piotridzikow...@gmail.com> wrote:
> > Hello.
> > I am going to switch to newest (4.10.2) version of Lucene and I'd like to
> > make some optimization in my index and code. I would like to use
> > DocValuesField to get values but also for filtering and sorting. So here
> I
> > have some questions: If I'd like to use range filter
> > (FieldCacheRangeFilter) I need to store a value in XxxDocValuesField, but
> > if i want to use terms filter (FieldCacheTermsFilter) I need to store a
> > value in SortedDocValuesField. So it looks like if I want to use range
> and
> > terms filters I need to have two different fields. Am I right? Am I using
> > it correctly?
>
> FieldCacheRangeFilter and FieldCacheTermsFilter only work well when
> you have lots of terms and most documents match your filter. Otherwise
> you should consider using the regular numeric range filter and terms
> filter. Although they might be a bit slower in the dense case, they
> will be significantly faster when few terms/documents match.
>
So for instance if I store documents with ie creation date and I have a
data (millions of documents) from last let's say 3 years and I'd like to do
range filter to get socs from some month only is it better to use ordinary
numeric query instead of FieldCacheRangeQuery?


>
> Both FieldCacheRangeFilter and FieldCacheTermsFilter would work on the
> same SortedDocValues field. What makes you think you need two fields ?
>
Code:
FieldCacheRangeFilter

*public static FieldCacheRangeFilter<Long> newLongRange(String field,
FieldCache.LongParser parser, Long lowerVal, Long upperVal, boolean
includeLower, boolean includeUpper) {*
*    return new FieldCacheRangeFilter<Long>(field, parser, lowerVal,
upperVal, includeLower, includeUpper) {*
*      @Override*
*      public DocIdSet getDocIdSet(AtomicReaderContext context, Bits
acceptDocs) throws IOException {*
*        final long inclusiveLowerPoint, inclusiveUpperPoint;*
*        if (lowerVal != null) {*
*          long i = lowerVal.longValue();*
*          if (!includeLower && i == Long.MAX_VALUE)*
*            return null;*
*          inclusiveLowerPoint = includeLower ? i : (i + 1L);*
*        } else {*
*          inclusiveLowerPoint = Long.MIN_VALUE;*
*        }*
*        if (upperVal != null) {*
*          long i = upperVal.longValue();*
*          if (!includeUpper && i == Long.MIN_VALUE)*
*            return null;*
*          inclusiveUpperPoint = includeUpper ? i : (i - 1L);*
*        } else {*
*          inclusiveUpperPoint = Long.MAX_VALUE;*
*        }*

*        if (inclusiveLowerPoint > inclusiveUpperPoint)*
*          return null;*

*        final FieldCache.Longs values =
FieldCache.DEFAULT.getLongs(context.reader(), field,
(FieldCache.LongParser) parser, false);*
*        return new FieldCacheDocIdSet(context.reader().maxDoc(),
acceptDocs) {*
*          @Override*
*          protected boolean matchDoc(int doc) {*
*            final long value = values.get(doc);*
*            return value >= inclusiveLowerPoint && value <=
inclusiveUpperPoint;*
*          }*
*        };*
*      }*
*    };*
*  }*

FieldCacheTermsFilter:

 *@Override*
*  public DocIdSet getDocIdSet(AtomicReaderContext context, Bits
acceptDocs) throws IOException {*
*    final SortedDocValues fcsi =
getFieldCache().getTermsIndex(context.reader(), field);*
*    final FixedBitSet bits = new FixedBitSet(fcsi.getValueCount());*
*    for (int i=0;i<terms.length;i++) {*
*      int ord = fcsi.lookupTerm(terms[i]);*
*      if (ord >= 0) {*
*        bits.set(ord);*
*      }*
*    }*



Regards
Piotr

Reply via email to