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
>

Reply via email to