@@ -23,7 +23,6 @@ import (
2323 "sync"
2424 "sync/atomic"
2525
26- "github.com/RoaringBitmap/roaring"
2726 "github.com/blevesearch/bleve/v2/search"
2827 index "github.com/blevesearch/bleve_index_api"
2928 segment_api "github.com/blevesearch/scorch_segment_api/v2"
@@ -65,27 +64,6 @@ func (o *OptimizeVR) Finish() error {
6564 var errorsM sync.Mutex
6665 var errors []error
6766
68- var snapshotGlobalDocNums map [int ]* roaring.Bitmap
69- var eligibleDocIDsMap map [string ]map [int ]* roaring.Bitmap
70- fields := make ([]string , len (o .vrs ))
71- for field := range o .vrs {
72- fields = append (fields , field )
73- }
74-
75- if o .requiresFiltering {
76- snapshotGlobalDocNums = o .snapshot .globalDocNums ()
77- eligibleDocIDsMap = make (map [string ]map [int ]* roaring.Bitmap )
78- for _ , field := range fields {
79- vrs := o .vrs [field ]
80- eligibleDocIDsMap [field ] = make (map [int ]* roaring.Bitmap )
81- for index , vr := range vrs {
82- if vr .eligibleDocIDs != nil && len (vr .eligibleDocIDs ) > 0 {
83- eligibleDocIDsMap [field ][index ] = vr .getEligibleDocIDs ()
84- }
85- }
86- }
87- }
88-
8967 defer o .invokeSearcherEndCallback ()
9068
9169 wg := sync.WaitGroup {}
@@ -100,8 +78,7 @@ func (o *OptimizeVR) Finish() error {
10078 <- semaphore // Release the semaphore slot
10179 wg .Done ()
10280 }()
103- for _ , field := range fields {
104- vrs := o .vrs [field ]
81+ for field , vrs := range o .vrs {
10582 vecIndex , err := segment .InterpretVectorIndex (field ,
10683 o .requiresFiltering , origSeg .deleted )
10784 if err != nil {
@@ -114,34 +91,19 @@ func (o *OptimizeVR) Finish() error {
11491 // update the vector index size as a meta value in the segment snapshot
11592 vectorIndexSize := vecIndex .Size ()
11693 origSeg .cachedMeta .updateMeta (field , vectorIndexSize )
117- for vrIdx , vr := range vrs {
94+ for _ , vr := range vrs {
11895 var pl segment_api.VecPostingsList
11996 var err error
12097
12198 // for each VR, populate postings list and iterators
12299 // by passing the obtained vector index and getting similar vectors.
123100
124- // Only applies to filtered kNN.
125- if vr .eligibleDocIDs != nil && len (vr .eligibleDocIDs ) > 0 {
126- eligibleVectorInternalIDs := eligibleDocIDsMap [field ][vrIdx ]
127- eligibleVectorInternalIDsClone := eligibleVectorInternalIDs .Clone ()
128- if snapshotGlobalDocNums != nil {
129- // Only the eligible documents belonging to this segment
130- // will get filtered out.
131- // There is no way to determine which doc belongs to which segment
132- eligibleVectorInternalIDsClone .And (snapshotGlobalDocNums [index ])
133- }
134-
135- eligibleLocalDocNums := make ([]uint64 , 0 )
136- // get the (segment-)local document numbers
137- for _ , docNum := range eligibleVectorInternalIDsClone .ToArray () {
138- localDocNum := o .snapshot .localDocNumFromGlobal (index ,
139- uint64 (docNum ))
140- eligibleLocalDocNums = append (eligibleLocalDocNums , localDocNum )
141- }
142-
101+ // check if the vector reader is configured to use a pre-filter
102+ // to filter out ineligible documents before performing
103+ // kNN search.
104+ if vr .eligibleSelector != nil {
143105 pl , err = vecIndex .SearchWithFilter (vr .vector , vr .k ,
144- eligibleLocalDocNums , vr .searchParams )
106+ vr . eligibleSelector . SegmentEligibleDocs ( index ) , vr .searchParams )
145107 } else {
146108 pl , err = vecIndex .Search (vr .vector , vr .k , vr .searchParams )
147109 }
@@ -195,7 +157,7 @@ func (s *IndexSnapshotVectorReader) VectorOptimize(ctx context.Context,
195157 }
196158 o .ctx = ctx
197159 if ! o .requiresFiltering {
198- o .requiresFiltering = len ( s . eligibleDocIDs ) > 0
160+ o .requiresFiltering = s . eligibleSelector != nil
199161 }
200162
201163 if o .snapshot != s .snapshot {
0 commit comments