mirror of https://github.com/Xhofe/alist
				
				
				
			
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
package bleve
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"os"
 | 
						|
 | 
						|
	query2 "github.com/blevesearch/bleve/v2/search/query"
 | 
						|
 | 
						|
	"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) {
 | 
						|
	var queries []query2.Query
 | 
						|
	query := bleve.NewMatchQuery(req.Keywords)
 | 
						|
	query.SetField("name")
 | 
						|
	queries = append(queries, query)
 | 
						|
	if req.Scope != 0 {
 | 
						|
		isDir := req.Scope == 1
 | 
						|
		isDirQuery := bleve.NewBoolFieldQuery(isDir)
 | 
						|
		queries = append(queries, isDirQuery)
 | 
						|
	}
 | 
						|
	reqQuery := bleve.NewConjunctionQuery(queries...)
 | 
						|
	search := bleve.NewSearchRequest(reqQuery)
 | 
						|
	search.SortBy([]string{"name"})
 | 
						|
	search.From = (req.Page - 1) * req.PerPage
 | 
						|
	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(searchResults.Total), nil
 | 
						|
}
 | 
						|
 | 
						|
func (b *Bleve) Index(ctx context.Context, node model.SearchNode) error {
 | 
						|
	return b.BIndex.Index(uuid.NewString(), node)
 | 
						|
}
 | 
						|
 | 
						|
func (b *Bleve) BatchIndex(ctx context.Context, nodes []model.SearchNode) error {
 | 
						|
	batch := b.BIndex.NewBatch()
 | 
						|
	for _, node := range nodes {
 | 
						|
		batch.Index(uuid.NewString(), node)
 | 
						|
	}
 | 
						|
	return b.BIndex.Batch(batch)
 | 
						|
}
 | 
						|
 | 
						|
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)
 |