Can you add some debug logging to see what the values of topList.doc and
reader.maxDoc() are before before you call advanceExact?

What do you mean by "I reuse the same DisiPriorityQueue of scorers in
score() and explain()". This shouldn't be possible.

Le lun. 19 févr. 2018 à 15:23, Vadim Gindin <vgin...@detectum.com> a écrit :

> I use these calls in both cases. In score() and explain() I have the
> following code:
>
> SortedNumericDocValues numDocVal = DocValues.getSortedNumeric(reader,
> fieldName);
> if (numDocVal != null && numDocVal.advanceExact(topList.doc)) {
>     long val = numDocVal.nextValue();
>
>     ..
> }
>
> I reuse the same DisiPriorityQueue of scorers in score() and explain().
>
> On Mon, Feb 19, 2018 at 6:54 PM, Adrien Grand <jpou...@gmail.com> wrote:
>
> > If you want to read the values again, you need to call setDocument
> (Lucene
> > < 7.0) or advanceExact (Lucene >= 7.0) before calling nextValue().
> >
> > Le lun. 19 févr. 2018 à 14:41, Vadim Gindin <vgin...@detectum.com> a
> > écrit :
> >
> > > Hi all
> > >
> > > I use DocValue for scoring function. I.e. I have some column with
> > integers,
> > > that are used in scoring formula. So I have a scorer that calculates
> > > scoring function twice:
> > > - in score()
> > > - in explain()
> > >
> > > I got the following error in explain:
> > >
> > > Caused by: java.lang.IndexOutOfBoundsException
> > >         at java.nio.Buffer.checkIndex(Buffer.java:540) ~[?:1.8.0_161]
> > >         at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:253)
> > > ~[?:1.8.0_161]
> > >         at
> > > org.apache.lucene.store.ByteBufferGuard.getByte(
> > ByteBufferGuard.java:118)
> > > ~[lucene-core-7.1.0.jar:7.1.0 84c90ad2c0218156c840e19a64d72b8a38550659
> -
> > > ubuntu - 2017-10-13 16:12:42]
> > >         at
> > >
> > > org.apache.lucene.store.ByteBufferIndexInput$SingleBufferImpl.readByte(
> > ByteBufferIndexInput.java:385)
> > > ~[lucene-core-7.1.0.jar:7.1.0 84c90ad2c0218156c840e19a64d72b8a38550659
> -
> > > ubuntu - 2017-10-13 16:12:42]
> > >         at
> > >
> > > org.apache.lucene.util.packed.DirectReader$DirectPackedReader8.get(
> > DirectReader.java:145)
> > > ~[lucene-core-7.1.0.jar:7.1.0 84c90ad2c0218156c840e19a64d72b8a38550659
> -
> > > ubuntu - 2017-10-13 16:12:42]
> > >         at
> > >
> > >
> org.apache.lucene.codecs.lucene70.Lucene70DocValuesProducer$3.longValue(
> > Lucene70DocValuesProducer.java:481)
> > > ~[lucene-core-7.1.0.jar:7.1.0 84c90ad2c0218156c840e19a64d72b8a38550659
> -
> > > ubuntu - 2017-10-13 16:12:42]
> > >         at
> > >
> > > org.apache.lucene.index.SingletonSortedNumericDocValues.nextValue(
> > SingletonSortedNumericDocValues.java:73)
> > > ~[lucene-core-7.1.0.jar:7.1.0 84c90ad2c0218156c840e19a64d72b8a38550659
> -
> > > ubuntu - 2017-10-13 16:12:42]
> > >
> > > I've found the following comment in the source code of
> > > SortedNumericDocValues.java:
> > >
> > > /**
> > >  * Iterates to the next value in the current document.  Do not call
> > > this more than {@link #docValueCount} times
> > >  * for the document.
> > >  */
> > >
> > > public abstract long nextValue() throws IOException;
> > >
> > >
> > > Questions:
> > > 1) Why I can't read the values twice?
> > > 2) How can I manage this situation?
> > > 3) Can it work for NumericDocValues?
> > >
> > > Regards,
> > > Vadim Gindin
> > >
> >
>

Reply via email to