feat: automatically add/remove sources to/from index
1 file changed, 35 insertions(+), 0 deletions(-)
changed files
M internal/index/indexer.go → internal/index/indexer.go
@@ -7,6 +7,7 @@ "encoding/gob" "io/fs" "log" "log/slog" + "math" "os" "path" "searchix/internal/file"@@ -326,3 +327,37 @@ } return nil } + +func (i *WriteIndex) DeleteBySource(source string) error { + query := bleve.NewTermQuery(source) + search := bleve.NewSearchRequest(query) + search.Size = math.MaxInt + search.Fields = []string{"_id"} + + results, err := i.index.Search(search) + if err != nil { + return errors.WithMessagef(err, "failed to query documents of retired index %s", source) + } + + batch := i.index.NewBatch() + var k uint + for _, hit := range results.Hits { + batch.Delete(hit.ID) + if k++; k%batchSize == 0 { + err := i.Flush(batch) + if err != nil { + return err + } + } + } + err = i.Flush(batch) + if err != nil { + return err + } + + if uint64(search.Size) < results.Total { + return i.DeleteBySource(source) // unlikely :^) + } + + return nil +}