feat: multiple search indexes (#2514)
* refactor: abstract search interface * wip: ~ * fix cycle import * objs update hook * wip: ~ * Delete search/none * auto update index while cache changed * db searcher TODO: bleve init issue cannot open index, metadata missing * fix size type why float64?? * fix typo * fix nil pointer using * api adapt ui * bleve: fix clear & change struct
This commit is contained in:
38
internal/search/bleve/init.go
Normal file
38
internal/search/bleve/init.go
Normal file
@ -0,0 +1,38 @@
|
||||
package bleve
|
||||
|
||||
import (
|
||||
"github.com/alist-org/alist/v3/internal/conf"
|
||||
"github.com/alist-org/alist/v3/internal/search/searcher"
|
||||
"github.com/blevesearch/bleve/v2"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
var config = searcher.Config{
|
||||
Name: "bleve",
|
||||
}
|
||||
|
||||
func Init(indexPath *string) (bleve.Index, error) {
|
||||
log.Debugf("bleve path: %s", *indexPath)
|
||||
fileIndex, err := bleve.Open(*indexPath)
|
||||
if err == bleve.ErrorIndexPathDoesNotExist {
|
||||
log.Infof("Creating new index...")
|
||||
indexMapping := bleve.NewIndexMapping()
|
||||
fileIndex, err = bleve.New(*indexPath, indexMapping)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return fileIndex, nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
searcher.RegisterSearcher(config, func() (searcher.Searcher, error) {
|
||||
b, err := Init(&conf.Conf.BleveDir)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &Bleve{BIndex: b}, nil
|
||||
})
|
||||
}
|
90
internal/search/bleve/search.go
Normal file
90
internal/search/bleve/search.go
Normal file
@ -0,0 +1,90 @@
|
||||
package bleve
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
|
||||
"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/search/searcher"
|
||||
"github.com/alist-org/alist/v3/pkg/utils"
|
||||
"github.com/blevesearch/bleve/v2"
|
||||
search2 "github.com/blevesearch/bleve/v2/search"
|
||||
"github.com/google/uuid"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type Bleve struct {
|
||||
BIndex bleve.Index
|
||||
}
|
||||
|
||||
func (b *Bleve) Config() searcher.Config {
|
||||
return config
|
||||
}
|
||||
|
||||
func (b *Bleve) Search(ctx context.Context, req model.SearchReq) ([]model.SearchNode, int64, error) {
|
||||
query := bleve.NewMatchQuery(req.Keywords)
|
||||
query.SetField("name")
|
||||
search := bleve.NewSearchRequest(query)
|
||||
search.Size = req.PerPage
|
||||
search.Fields = []string{"*"}
|
||||
searchResults, err := b.BIndex.Search(search)
|
||||
if err != nil {
|
||||
log.Errorf("search error: %+v", err)
|
||||
return nil, 0, err
|
||||
}
|
||||
res, err := utils.SliceConvert(searchResults.Hits, func(src *search2.DocumentMatch) (model.SearchNode, error) {
|
||||
return model.SearchNode{
|
||||
Parent: src.Fields["parent"].(string),
|
||||
Name: src.Fields["name"].(string),
|
||||
IsDir: src.Fields["is_dir"].(bool),
|
||||
Size: int64(src.Fields["size"].(float64)),
|
||||
}, nil
|
||||
})
|
||||
return res, int64(len(res)), nil
|
||||
}
|
||||
|
||||
func (b *Bleve) Index(ctx context.Context, parent string, obj model.Obj) error {
|
||||
return b.BIndex.Index(uuid.NewString(), model.SearchNode{
|
||||
Parent: parent,
|
||||
Name: obj.GetName(),
|
||||
IsDir: obj.IsDir(),
|
||||
Size: obj.GetSize(),
|
||||
})
|
||||
}
|
||||
|
||||
func (b *Bleve) Get(ctx context.Context, parent string) ([]model.SearchNode, error) {
|
||||
return nil, errs.NotSupport
|
||||
}
|
||||
|
||||
func (b *Bleve) Del(ctx context.Context, prefix string) error {
|
||||
return errs.NotSupport
|
||||
}
|
||||
|
||||
func (b *Bleve) Release(ctx context.Context) error {
|
||||
if b.BIndex != nil {
|
||||
return b.BIndex.Close()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Bleve) Clear(ctx context.Context) error {
|
||||
err := b.Release(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Removing old index...")
|
||||
err = os.RemoveAll(conf.Conf.BleveDir)
|
||||
if err != nil {
|
||||
log.Errorf("clear bleve error: %+v", err)
|
||||
}
|
||||
bIndex, err := Init(&conf.Conf.BleveDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.BIndex = bIndex
|
||||
return nil
|
||||
}
|
||||
|
||||
var _ searcher.Searcher = (*Bleve)(nil)
|
Reference in New Issue
Block a user