Hi,
just to add: Any public query API (weight, query, DocIdSetIterators,…) should always take LeafReaderContext as parameter. If you have some solr plugin that maybe implements some method only taking LeafReader, this one lost context and it’s impossible to restore from that. So if sending IndexReader instances around (no matter what type), always use ReaderContexts, especially in public APIs. Uwe ----- Uwe Schindler Achterdiek 19, D-28357 Bremen https://www.thetaphi.de eMail: [email protected] From: Joel Bernstein <[email protected]> Sent: Sunday, December 27, 2020 7:36 PM To: lucene dev <[email protected]> Subject: Re: LeafReaderContext ord is unexpectedly 0 Ok this makes sense. I suspect I never ran across this before because I always accessed the ord through the context before getting the reader. Joel Bernstein http://joelsolr.blogspot.com/ On Sun, Dec 27, 2020 at 1:10 PM Uwe Schindler <[email protected] <mailto:[email protected]> > wrote: Hi, that behaviour is fully correct and was always like that. Just for info (I had some slides on berlinbuzzwords like 8.5 years ago): https://youtu.be/iZZ1AbJ6dik?t=1975 The problem is a classical “wrong point of view” problem! IndexReaders and their subclasses have no idea about their neighbours or parents, they can always be used on their own. They can also be in multiple contexts (!!!!), like a LeafReader (in that talk we used AtomicReader) is part of a DirectoryReader but at same time somebody else has constructed another composite reader with LeafReaders from totally different directories (e.g., when merging different indexes together). So in short: A reader does not know anything about its own “where I am”. The method getContext() is only there as a helper method (it’s a bit misnomed), to create a *new* context that describes this reader as the only one in it, so inside this new context it has an ord of 0. The problem in your code is: you dive down through the correct context from top-level (the top context is from the point of view of the SolrSearcher), but then you leave this hierarchy by calling reader(). At that point you lost context information. After that you get a new context and this one returns 0, because its no longer form SolrIndexSearcher’s point of view, but its own PoV. Replace: leaves.get(5).reader().getContext().ord By: leaves.get(5).ord And you’re fine. The red part leaves the top level context and then creates a new one – an then you’re lost! Uwe ----- Uwe Schindler Achterdiek 19, D-28357 Bremen https://www.thetaphi.de eMail: [email protected] <mailto:[email protected]> From: Joel Bernstein <[email protected] <mailto:[email protected]> > Sent: Sunday, December 27, 2020 5:59 PM To: lucene dev <[email protected] <mailto:[email protected]> > Subject: LeafReaderContext ord is unexpectedly 0 I ran into this while writing some Solr code today. List<LeafReaderContext> leaves = req.getSearcher().getTopReaderContext().leaves(); The req is a SolrQueryRequest object. Now if I do this: leaves.get(5).reader().getContext().ord I would expect ord in this scenario to be 5. But in my testing in master it's returning 0. It seems like this is a bug. Not sure yet if this is a bug in Sor or Lucene. Am I missing anything here that anyone can see? Joel Bernstein http://joelsolr.blogspot.com/
