20
20
import org .apache .lucene .util .BitSetIterator ;
21
21
import org .apache .lucene .util .Bits ;
22
22
import org .apache .lucene .util .FixedBitSet ;
23
+ import org .opensearch .common .Nullable ;
24
+ import org .opensearch .common .StopWatch ;
23
25
import org .opensearch .common .lucene .Lucene ;
24
26
import org .opensearch .knn .common .FieldInfoExtractor ;
25
27
import org .opensearch .knn .common .KNNConstants ;
@@ -129,7 +131,13 @@ public Scorer scorer(LeafReaderContext context) throws IOException {
129
131
* @return A Map of docId to scores for top k results
130
132
*/
131
133
public PerLeafResult searchLeaf (LeafReaderContext context , int k ) throws IOException {
134
+ final SegmentReader reader = Lucene .segmentReader (context .reader ());
135
+ final String segmentName = reader .getSegmentName ();
136
+
137
+ StopWatch stopWatch = startStopWatch ();
132
138
final BitSet filterBitSet = getFilteredDocsBitSet (context );
139
+ stopStopWatchAndLog (stopWatch , "FilterBitSet creation" , segmentName );
140
+
133
141
final int maxDoc = context .reader ().maxDoc ();
134
142
int cardinality = filterBitSet .cardinality ();
135
143
// We don't need to go to JNI layer if no documents are found which satisfy the filters
@@ -153,7 +161,10 @@ public PerLeafResult searchLeaf(LeafReaderContext context, int k) throws IOExcep
153
161
* so that it will not do a bitset look up in bottom search layer.
154
162
*/
155
163
final BitSet annFilter = (filterWeight != null && cardinality == maxDoc ) ? null : filterBitSet ;
156
- final Map <Integer , Float > docIdsToScoreMap = doANNSearch (context , annFilter , cardinality , k );
164
+
165
+ StopWatch annStopWatch = startStopWatch ();
166
+ final Map <Integer , Float > docIdsToScoreMap = doANNSearch (reader , context , annFilter , cardinality , k );
167
+ stopStopWatchAndLog (annStopWatch , "ANN search" , segmentName );
157
168
158
169
// See whether we have to perform exact search based on approx search results
159
170
// This is required if there are no native engine files or if approximate search returned
@@ -166,6 +177,14 @@ public PerLeafResult searchLeaf(LeafReaderContext context, int k) throws IOExcep
166
177
return new PerLeafResult (filterWeight == null ? null : filterBitSet , docIdsToScoreMap );
167
178
}
168
179
180
+ private void stopStopWatchAndLog (@ Nullable final StopWatch stopWatch , final String prefixMessage , String segmentName ) {
181
+ if (log .isDebugEnabled () && stopWatch != null ) {
182
+ stopWatch .stop ();
183
+ final String logMessage = prefixMessage + " shard: [{}], segment: [{}], field: [{}], time in nanos:[{}] " ;
184
+ log .debug (logMessage , knnQuery .getShardId (), segmentName , knnQuery .getField (), stopWatch .totalTime ().nanos ());
185
+ }
186
+ }
187
+
169
188
private BitSet getFilteredDocsBitSet (final LeafReaderContext ctx ) throws IOException {
170
189
if (this .filterWeight == null ) {
171
190
return new FixedBitSet (0 );
@@ -222,7 +241,7 @@ private Map<Integer, Float> doExactSearch(
222
241
final LeafReaderContext context ,
223
242
final DocIdSetIterator acceptedDocs ,
224
243
final long numberOfAcceptedDocs ,
225
- int k
244
+ final int k
226
245
) throws IOException {
227
246
final ExactSearcherContextBuilder exactSearcherContextBuilder = ExactSearcher .ExactSearcherContext .builder ()
228
247
.isParentHits (true )
@@ -237,13 +256,12 @@ private Map<Integer, Float> doExactSearch(
237
256
}
238
257
239
258
private Map <Integer , Float > doANNSearch (
259
+ final SegmentReader reader ,
240
260
final LeafReaderContext context ,
241
261
final BitSet filterIdsBitSet ,
242
262
final int cardinality ,
243
263
final int k
244
264
) throws IOException {
245
- final SegmentReader reader = Lucene .segmentReader (context .reader ());
246
-
247
265
FieldInfo fieldInfo = FieldInfoExtractor .getFieldInfo (reader , knnQuery .getField ());
248
266
249
267
if (fieldInfo == null ) {
@@ -402,7 +420,11 @@ public Map<Integer, Float> exactSearch(
402
420
final LeafReaderContext leafReaderContext ,
403
421
final ExactSearcher .ExactSearcherContext exactSearcherContext
404
422
) throws IOException {
405
- return exactSearcher .searchLeaf (leafReaderContext , exactSearcherContext );
423
+ StopWatch stopWatch = startStopWatch ();
424
+ Map <Integer , Float > exactSearchResults = exactSearcher .searchLeaf (leafReaderContext , exactSearcherContext );
425
+ final SegmentReader reader = Lucene .segmentReader (leafReaderContext .reader ());
426
+ stopStopWatchAndLog (stopWatch , "Exact search" , reader .getSegmentName ());
427
+ return exactSearchResults ;
406
428
}
407
429
408
430
@ Override
@@ -523,4 +545,11 @@ private boolean isMissingNativeEngineFiles(LeafReaderContext context) {
523
545
);
524
546
return engineFiles .isEmpty ();
525
547
}
548
+
549
+ private StopWatch startStopWatch () {
550
+ if (log .isDebugEnabled ()) {
551
+ return new StopWatch ().start ();
552
+ }
553
+ return null ;
554
+ }
526
555
}
0 commit comments