alist/internal/search/search.go

96 lines
2.0 KiB
Go
Raw Normal View History

package search
import (
"context"
"fmt"
"github.com/alist-org/alist/v3/internal/conf"
"github.com/alist-org/alist/v3/internal/errs"
"github.com/alist-org/alist/v3/internal/model"
"github.com/alist-org/alist/v3/internal/op"
"github.com/alist-org/alist/v3/internal/search/searcher"
log "github.com/sirupsen/logrus"
)
var instance searcher.Searcher = nil
// Init or reset index
func Init(mode string) error {
if instance != nil {
2022-12-05 07:46:34 +00:00
// unchanged, do nothing
if instance.Config().Name == mode {
return nil
}
err := instance.Release(context.Background())
if err != nil {
log.Errorf("release instance err: %+v", err)
}
instance = nil
}
if Running() {
return fmt.Errorf("index is running")
}
if mode == "none" {
log.Warnf("not enable search")
return nil
}
s, ok := searcher.NewMap[mode]
if !ok {
return fmt.Errorf("not support index: %s", mode)
}
i, err := s()
if err != nil {
log.Errorf("init searcher error: %+v", err)
} else {
instance = i
}
return err
}
func Search(ctx context.Context, req model.SearchReq) ([]model.SearchNode, int64, error) {
return instance.Search(ctx, req)
}
func Index(ctx context.Context, parent string, obj model.Obj) error {
if instance == nil {
return errs.SearchNotAvailable
}
return instance.Index(ctx, model.SearchNode{
Parent: parent,
Name: obj.GetName(),
IsDir: obj.IsDir(),
Size: obj.GetSize(),
})
}
2022-12-05 07:46:34 +00:00
type ObjWithParent struct {
Parent string
model.Obj
}
func BatchIndex(ctx context.Context, objs []ObjWithParent) error {
if instance == nil {
return errs.SearchNotAvailable
}
2022-12-05 07:46:34 +00:00
if len(objs) == 0 {
return nil
}
2022-12-05 07:46:34 +00:00
var searchNodes []model.SearchNode
for i := range objs {
searchNodes = append(searchNodes, model.SearchNode{
2022-12-05 07:46:34 +00:00
Parent: objs[i].Parent,
Name: objs[i].GetName(),
IsDir: objs[i].IsDir(),
Size: objs[i].GetSize(),
})
}
return instance.BatchIndex(ctx, searchNodes)
}
func init() {
op.RegisterSettingItemHook(conf.SearchIndex, func(item *model.SettingItem) error {
log.Debugf("searcher init, mode: %s", item.Value)
return Init(item.Value)
})
}