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 ;
@@ -128,7 +130,13 @@ public Scorer scorer(LeafReaderContext context) throws IOException {
128
130
* @return A Map of docId to scores for top k results
129
131
*/
130
132
public PerLeafResult searchLeaf (LeafReaderContext context , int k ) throws IOException {
133
+ final SegmentReader reader = Lucene .segmentReader (context .reader ());
134
+ final String segmentName = reader .getSegmentName ();
135
+
136
+ StopWatch stopWatch = startStopWatch ();
131
137
final BitSet filterBitSet = getFilteredDocsBitSet (context );
138
+ stopStopWatchAndLog (stopWatch , "FilterBitSet creation" , segmentName );
139
+
132
140
final int maxDoc = context .reader ().maxDoc ();
133
141
int cardinality = filterBitSet .cardinality ();
134
142
// We don't need to go to JNI layer if no documents are found which satisfy the filters
@@ -152,7 +160,10 @@ public PerLeafResult searchLeaf(LeafReaderContext context, int k) throws IOExcep
152
160
* so that it will not do a bitset look up in bottom search layer.
153
161
*/
154
162
final BitSet annFilter = (filterWeight != null && cardinality == maxDoc ) ? null : filterBitSet ;
155
- final Map <Integer , Float > docIdsToScoreMap = doANNSearch (context , annFilter , cardinality , k );
163
+
164
+ StopWatch annStopWatch = startStopWatch ();
165
+ final Map <Integer , Float > docIdsToScoreMap = doANNSearch (reader , context , annFilter , cardinality , k );
166
+ stopStopWatchAndLog (annStopWatch , "ANN search" , segmentName );
156
167
157
168
// See whether we have to perform exact search based on approx search results
158
169
// This is required if there are no native engine files or if approximate search returned
@@ -165,6 +176,14 @@ public PerLeafResult searchLeaf(LeafReaderContext context, int k) throws IOExcep
165
176
return new PerLeafResult (filterWeight == null ? null : filterBitSet , docIdsToScoreMap );
166
177
}
167
178
179
+ private void stopStopWatchAndLog (@ Nullable final StopWatch stopWatch , final String prefixMessage , String segmentName ) {
180
+ if (log .isDebugEnabled () && stopWatch != null ) {
181
+ stopWatch .stop ();
182
+ final String logMessage = prefixMessage + " shard: [{}], segment: [{}], field: [{}], time in nanos:[{}] " ;
183
+ log .debug (logMessage , knnQuery .getShardId (), segmentName , knnQuery .getField (), stopWatch .totalTime ().nanos ());
184
+ }
185
+ }
186
+
168
187
private BitSet getFilteredDocsBitSet (final LeafReaderContext ctx ) throws IOException {
169
188
if (this .filterWeight == null ) {
170
189
return new FixedBitSet (0 );
@@ -221,7 +240,7 @@ private Map<Integer, Float> doExactSearch(
221
240
final LeafReaderContext context ,
222
241
final DocIdSetIterator acceptedDocs ,
223
242
final long numberOfAcceptedDocs ,
224
- int k
243
+ final int k
225
244
) throws IOException {
226
245
final ExactSearcherContextBuilder exactSearcherContextBuilder = ExactSearcher .ExactSearcherContext .builder ()
227
246
.isParentHits (true )
@@ -236,13 +255,12 @@ private Map<Integer, Float> doExactSearch(
236
255
}
237
256
238
257
private Map <Integer , Float > doANNSearch (
258
+ final SegmentReader reader ,
239
259
final LeafReaderContext context ,
240
260
final BitSet filterIdsBitSet ,
241
261
final int cardinality ,
242
262
final int k
243
263
) throws IOException {
244
- final SegmentReader reader = Lucene .segmentReader (context .reader ());
245
-
246
264
FieldInfo fieldInfo = FieldInfoExtractor .getFieldInfo (reader , knnQuery .getField ());
247
265
248
266
if (fieldInfo == null ) {
@@ -401,7 +419,11 @@ public Map<Integer, Float> exactSearch(
401
419
final LeafReaderContext leafReaderContext ,
402
420
final ExactSearcher .ExactSearcherContext exactSearcherContext
403
421
) throws IOException {
404
- return exactSearcher .searchLeaf (leafReaderContext , exactSearcherContext );
422
+ StopWatch stopWatch = startStopWatch ();
423
+ Map <Integer , Float > exactSearchResults = exactSearcher .searchLeaf (leafReaderContext , exactSearcherContext );
424
+ final SegmentReader reader = Lucene .segmentReader (leafReaderContext .reader ());
425
+ stopStopWatchAndLog (stopWatch , "Exact search" , reader .getSegmentName ());
426
+ return exactSearchResults ;
405
427
}
406
428
407
429
@ Override
@@ -508,4 +530,11 @@ private boolean isMissingNativeEngineFiles(LeafReaderContext context) {
508
530
);
509
531
return engineFiles .isEmpty ();
510
532
}
533
+
534
+ private StopWatch startStopWatch () {
535
+ if (log .isDebugEnabled ()) {
536
+ return new StopWatch ().start ();
537
+ }
538
+ return null ;
539
+ }
511
540
}
0 commit comments