Hi Patrick, Thanks for the quick response and the explanation and sources are helpful! But there is still a point we couldn't quite understand: why did the test I mentioned earlier pass (applyAllDeletes false and do maybeRefresh())? If the delete is not applied, we should see the deleted doc in the search result right? I even ran it more than 10k times, but I never hit a case where the search result contains the deleted doc (meaning the delete has not been applied).
Sincerely, Ningshan On Thu, Mar 2, 2023 at 3:30 PM Patrick Zhai <zhai7...@gmail.com> wrote: > Hi Ningshan, > If you want to make sure the deletes are applied after you call > maybeRefresh() then you need to set the applyAllDeletes to be true. > > A bit more details: > The constructor of SearcherManager actually internally passes the > applyAllDeletes to the IndexWriter, which then will pass it to the > StandardDirectoryReader here > <https://github.com/apache/lucene-solr/blob/branch_7_4/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java#L524> > Then whenever you make a maybeRefresh call, the reader will try to refresh > itself using the parameters it is init'd with (src > <https://github.com/apache/lucene-solr/blob/branch_7_4/lucene/core/src/java/org/apache/lucene/index/StandardDirectoryReader.java#L288> > ) > So basically the applyAllDeletes you passed into SearcherManager will > affect every call to the maybeRefresh. > > Best > Patrick > > On Thu, Mar 2, 2023 at 3:03 PM Ningshan Li <ningshan...@rubrik.com> wrote: > >> Hi! >> >> Hope you are all doing well! We are using searcherManager ( >> >> https://lucene.apache.org/core/7_4_0/core/org/apache/lucene/search/SearcherManager.html >> ) >> and get a little confused on applyAllDeletes parameter in the constructor >> and the method maybeRefresh(). In our case, we need to search over >> refreshed docs before we call writer.Commit(). So we are thinking of >> constructing the SearcherManager with applyAllDeletes true. However, we >> find there is another method ReferenceManager.maybeRefresh() >> < >> https://lucene.apache.org/core/7_4_0/core/org/apache/lucene/search/ReferenceManager.html#maybeRefresh-- >> > >> where >> we refresh instances. >> >> My question is if we periodically call maybeRefresh(), and make sure the >> manager is refreshed every time before we acquire a new searcher, do we >> still need to set applyAllDeletes to true when constructing the manager? >> >> For example, I wrote a simple test like: >> >> > val manager = new SearcherManager(writer, false /*applyAllDeletes*/, >> > false, null) >> > writer.deleteDocuments(term) // delete some docs >> > >> > manager.maybeRefresh() >> > val searcher = manager.acquire() >> >> val hits = searcher.search(...) >> >> hits.totalHits shouldBe 0 >> >> and the test would pass (deletes are applied) >> >> >> Sincerely, >> Ningshan >> > -- [image: RubrikLogo140x4015743589431587568119.png] <https://www.rubrik.com/> Ningshan Li Software Engineer at Rubrik E ningshan...@rubrik.com Wwww.rubrik.com [image: Learn More...] <https://signatures.rubrik.com/uc/61d4c3917829b800215934bd>