@@ -136,41 +136,36 @@ public Query rewrite(IndexSearcher indexSearcher) throws IOException {
136136        List <SegmentAffinity > segmentAffinities  = calculateSegmentAffinities (leafReaderContexts , getQueryVector ());
137137
138138        // TODO: sort segments by affinity score in descending order, and cut the long tail ? 
139- 
140-         List <LeafReaderContext > selectedSegments  = new  ArrayList <>();
141- 
142139        double [] affinityScores  = segmentAffinities .stream ().map (SegmentAffinity ::affinityScore ).mapToDouble (Double ::doubleValue ).toArray ();
143140
144141        // max affinity for decreasing nProbe 
145-         double  average  = Arrays .stream (affinityScores ).average ().orElseThrow ( );
146-         double  maxAffinity  = Arrays .stream (affinityScores ).max ().orElseThrow ( );
142+         double  average  = Arrays .stream (affinityScores ).average ().orElse ( 0.0 );
143+         double  maxAffinity  = Arrays .stream (affinityScores ).max ().orElse ( 0.0 );
147144        double  lowerAffinity  = (maxAffinity  + average ) * 0.5 ;
148145        double  cutoffAffinity  = lowerAffinity  * 0.5 ; // minimum affinity score for a segment to be considered 
149146        double  affinityTreshold  = (maxAffinity  + lowerAffinity ) * 0.66 ; // min affinity for increasing nProbe 
150147        int  maxAdjustments  = (int ) (nProbe  * 1.5 );
151148
152149        Map <LeafReaderContext , Integer > segmentNProbeMap  = new  HashMap <>();
153-         // Process  segments based on their affinity scores 
150+         // process  segments based on their affinity scores 
154151        for  (SegmentAffinity  affinity  : segmentAffinities ) {
155152            double  score  = affinity .affinityScore ();
156153
157-             // Skip  segments with very low affinity 
154+             // skip  segments with very low affinity 
158155            if  (score  < cutoffAffinity ) {
159156                continue ;
160157            }
161158
162-             // Adjust nProbe based on affinity score 
163-             // with larger affinity we increase nprobe (and viceversa) 
159+             // sdjust nProbe based on affinity score, with larger affinity we increase nprobe (and viceversa) 
164160            int  adjustedNProbe  = adjustNProbeForSegment (score , affinityTreshold , maxAdjustments );
165161
166-             // Store  the adjusted nProbe value for this segment 
162+             // store  the adjusted nProbe value for this segment 
167163            segmentNProbeMap .put (affinity .context (), adjustedNProbe );
168-             selectedSegments .add (affinity .context ());
169164        }
170165
171-         List <Callable <TopDocs >> tasks  = new  ArrayList <>(selectedSegments .size ());
172-         for  (LeafReaderContext   context  :  selectedSegments ) {
173-             tasks .add (() -> searchLeaf (context , filterWeight , knnCollectorManager , segmentNProbeMap . getOrDefault ( context ,  nProbe )));
166+         List <Callable <TopDocs >> tasks  = new  ArrayList <>(segmentNProbeMap .size ());
167+         for  (Map . Entry < LeafReaderContext ,  Integer >  entry  :  segmentNProbeMap . entrySet () ) {
168+             tasks .add (() -> searchLeaf (entry . getKey () , filterWeight , knnCollectorManager , entry . getValue ( )));
174169        }
175170        TopDocs [] perLeafResults  = taskExecutor .invokeAll (tasks ).toArray (TopDocs []::new );
176171
0 commit comments