@@ -132,19 +132,17 @@ public Query rewrite(IndexSearcher indexSearcher) throws IOException {
132132 List <LeafReaderContext > leafReaderContexts = reader .leaves ();
133133
134134 // calculate the affinity of each segment to the query vector
135- // (need information from each segment: no. of clusters, global centroid, density, whatever, .. .)
135+ // (need information from each segment: no. of clusters, global centroid, density, parent centroids' scores, etc .)
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- // with larger affinity we increase nprobe (and viceversa)
141- // also sort segments by affinity and eventually filter out the long tail
139+
142140 List <LeafReaderContext > selectedSegments = new ArrayList <>();
143141
144- // TODO : are these magic numbers ?
145- double cutoff_affinity = 0.01 ; // minimum affinity score for a segment to be considered
146- double higher_affinity = 0.6 ; // min affinity for increasing nProbe
147- double lower_affinity = 0.6 ; // max affinity for decreasing nProbe
142+ double cutoff_affinity = 0.3 ; // minimum affinity score for a segment to be considered
143+ double higher_affinity = 0.7 ; // min affinity for increasing nProbe
144+ double lower_affinity = 0.6 ; // max affinity for decreasing nProbe
145+
148146 int max_adjustment = 20 ;
149147
150148 Map <LeafReaderContext , Integer > segmentNProbeMap = new HashMap <>();
@@ -244,15 +242,18 @@ private List<SegmentAffinity> calculateSegmentAffinities(List<LeafReaderContext>
244242 int numCentroids = reader .getNumCentroids (fieldInfo );
245243 double centroidDensity = (double ) numCentroids / leafReader .numDocs ();
246244
247- if (numCentroids > 64 ) {
248- float [] parentCentroidsScores = reader .getParentCentroidsScores (
245+ // include some centroids' scores
246+ if (numCentroids > 32 ) {
247+ float [] centroidScores = reader .getCentroidsScores (
249248 fieldInfo ,
250249 numCentroids ,
251250 reader .getIvfCentroids (fieldInfo ),
252- queryVector
251+ queryVector ,
252+ numCentroids > 64
253253 );
254- Arrays .sort (parentCentroidsScores );
255- globalCentroidScore = (parentCentroidsScores [0 ] + parentCentroidsScores [1 ] + globalCentroidScore ) / 3 ;
254+ Arrays .sort (centroidScores );
255+ globalCentroidScore = (globalCentroidScore + centroidScores [centroidScores .length - 1 ]
256+ + centroidScores [centroidScores .length - 2 ]) / 3 ;
256257 }
257258
258259 double affinityScore = globalCentroidScore * (1 + centroidDensity );
0 commit comments