Hi Adrien, You are right, the Max Conjunction scorer shows up in the flamegraph for 12 MUST clauses: https://htmlpreview.github.io/?https://github.com/wurui90/scratch/blob/main/flamegraphs/exists-with-limit-200-lucene911-must.html
Thanks! On Fri, Sep 20, 2024 at 2:27 AM Adrien Grand <jpou...@gmail.com> wrote: > This suggests that BlockMaxConjunctionBulkScorer has a similar issue, I'll > look into it too. > > On Thu, Sep 19, 2024 at 2:48 AM Rui Wu <rui...@mongodb.com> wrote: > >> Hi Adrien, >> >> Thanks for your help and putting up a fix! >> >> Another experiment I did without your PR: if the 12 SHOULD clauses are >> changed to 12 MUST clauses, the problem is the same: it collects 3.6M docs >> on Lucene911 but 1001 docs on Lucene97. Does this data point align with how >> MaxScoreBulkScorer works? >> >> Thanks! >> >> On Wed, Sep 18, 2024 at 1:51 AM Adrien Grand <jpou...@gmail.com> wrote: >> >>> Thank you, this last comment was helpful and helped me understand the >>> problem. I opened a PR at https://github.com/apache/lucene/pull/13800. >>> >>> On Tue, Sep 17, 2024 at 7:45 PM Rui Wu <rui...@mongodb.com> wrote: >>> >>>> Another information is that, in Lucene97, this query (12 SHOULD >>>> clauses) collected 1001 results; while in Lucene911, this query (12 SHOULD >>>> clauses) collected all docs (3.6M collect count). >>>> >>>> In Lucene911, if the query has only one SHOULD clause, it collects 1001 >>>> results. If the query has multiple clauses, it collects 3.6M results. >>>> >>>> On Tue, Sep 17, 2024 at 9:09 AM Rui Wu <rui...@mongodb.com> wrote: >>>> >>>>> This query latency increased from 14.65 to 20.90ms. >>>>> >>>>> We use the `TopScoreDocCollector.createSharedManager(/*batchSize*/ >>>>> 101, /*searchAfterFieldDoc*/ null, /*hitsThreshold*/ 1000); ` >>>>> >>>>> Thanks a lot! >>>>> >>>>> On Tue, Sep 17, 2024 at 6:45 AM Adrien Grand <jpou...@gmail.com> >>>>> wrote: >>>>> >>>>>> Can you tell us how long this query used to take, and how long it >>>>>> takes now? >>>>>> Also are you using IndexSearcher's default total hit count threshold >>>>>> of 1,000, or are you passing a custom value to >>>>>> TopScoreDocCollectorManager? >>>>>> >>>>>> On Tue, Sep 17, 2024 at 10:14 AM Rui Wu <rui...@mongodb.com> wrote: >>>>>> >>>>>>> Hi Adrien, >>>>>>> >>>>>>> Thanks for looking into this! Here are more screenshots of the >>>>>>> flamegraph. The original flamegraph HTMLs have stack traces from our >>>>>>> app so >>>>>>> I don't share it here. >>>>>>> [image: Screenshot 2024-09-17 at 1.13.07 AM.png][image: Screenshot >>>>>>> 2024-09-17 at 1.12.01 AM.png] >>>>>>> >>>>>>> On Tue, Sep 17, 2024 at 1:00 AM Adrien Grand <jpou...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>>> Hello Rui, >>>>>>>> >>>>>>>> We actually released a change that should make MaxScoreBulkScorer >>>>>>>> faster on dense disjunctions in 9.8: >>>>>>>> https://github.com/apache/lucene/pull/12444. Your benchmark case >>>>>>>> is quite specific though as all clauses match all docs and produce >>>>>>>> constant >>>>>>>> scores, so I would expect the scorer to quickly realize that it can >>>>>>>> skip >>>>>>>> all documents once it's scored the first k docs. This makes me wonder >>>>>>>> if it >>>>>>>> bottleneck on skipping blocks of documents rather than on scoring them. >>>>>>>> Would you be able to share your whole flame graph, it looks like it >>>>>>>> may be >>>>>>>> truncated a the top? >>>>>>>> >>>>>>>> On Mon, Sep 16, 2024 at 10:01 PM Rui Wu <rui...@mongodb.com> wrote: >>>>>>>> >>>>>>>>> Correction: The index has 3.6 million documents. >>>>>>>>> >>>>>>>>> On Mon, Sep 16, 2024 at 1:00 PM Rui Wu <rui...@mongodb.com> wrote: >>>>>>>>> >>>>>>>>>> Dear experts, >>>>>>>>>> >>>>>>>>>> In our Mongodb Atlas Search performance regression test between >>>>>>>>>> Lucene 9.7 and Lucene 9.11, we detect a 43% latency regression in >>>>>>>>>> this >>>>>>>>>> query shape: >>>>>>>>>> 12 SHOULD clause, and each clause matches all of the documents. >>>>>>>>>> Each should clause is wrapped in ConstantScoreQuery. >>>>>>>>>> >>>>>>>>>> The index has 3.6 documents, and every document is identical: >>>>>>>>>> Every document is {"path": ["1", "2", "3" ... "12"]} >>>>>>>>>> The query shape is a BooleanQuery of SHOULD "1", SHOULD "2", ... >>>>>>>>>> SHOULD "12". >>>>>>>>>> >>>>>>>>>> Our flamegraphs show that most of the time in search() is spent >>>>>>>>>> on the MaxScoreBulkScorer class: >>>>>>>>>> [image: image.png] >>>>>>>>>> >>>>>>>>>> We wonder if this extreme test case is expected to be slow on >>>>>>>>>> MaxScoreBulkScorer? >>>>>>>>>> >>>>>>>>>> Thanks a lot! >>>>>>>>>> >>>>>>>>>> Rui Wu >>>>>>>>>> Lead Engineer, MongoDB >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Adrien >>>>>>>> >>>>>>> >>>>>> >>>>>> -- >>>>>> Adrien >>>>>> >>>>> >>> >>> -- >>> Adrien >>> >> > > -- > Adrien >