Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/search/bleve/search.go
1562 views
1
package bleve
2
3
import (
4
"context"
5
"os"
6
7
query2 "github.com/blevesearch/bleve/v2/search/query"
8
9
"github.com/alist-org/alist/v3/internal/conf"
10
"github.com/alist-org/alist/v3/internal/errs"
11
"github.com/alist-org/alist/v3/internal/model"
12
"github.com/alist-org/alist/v3/internal/search/searcher"
13
"github.com/alist-org/alist/v3/pkg/utils"
14
"github.com/blevesearch/bleve/v2"
15
search2 "github.com/blevesearch/bleve/v2/search"
16
"github.com/google/uuid"
17
log "github.com/sirupsen/logrus"
18
)
19
20
type Bleve struct {
21
BIndex bleve.Index
22
}
23
24
func (b *Bleve) Config() searcher.Config {
25
return config
26
}
27
28
func (b *Bleve) Search(ctx context.Context, req model.SearchReq) ([]model.SearchNode, int64, error) {
29
var queries []query2.Query
30
query := bleve.NewMatchQuery(req.Keywords)
31
query.SetField("name")
32
queries = append(queries, query)
33
if req.Scope != 0 {
34
isDir := req.Scope == 1
35
isDirQuery := bleve.NewBoolFieldQuery(isDir)
36
queries = append(queries, isDirQuery)
37
}
38
reqQuery := bleve.NewConjunctionQuery(queries...)
39
search := bleve.NewSearchRequest(reqQuery)
40
search.SortBy([]string{"name"})
41
search.From = (req.Page - 1) * req.PerPage
42
search.Size = req.PerPage
43
search.Fields = []string{"*"}
44
searchResults, err := b.BIndex.Search(search)
45
if err != nil {
46
log.Errorf("search error: %+v", err)
47
return nil, 0, err
48
}
49
res, err := utils.SliceConvert(searchResults.Hits, func(src *search2.DocumentMatch) (model.SearchNode, error) {
50
return model.SearchNode{
51
Parent: src.Fields["parent"].(string),
52
Name: src.Fields["name"].(string),
53
IsDir: src.Fields["is_dir"].(bool),
54
Size: int64(src.Fields["size"].(float64)),
55
}, nil
56
})
57
return res, int64(searchResults.Total), nil
58
}
59
60
func (b *Bleve) Index(ctx context.Context, node model.SearchNode) error {
61
return b.BIndex.Index(uuid.NewString(), node)
62
}
63
64
func (b *Bleve) BatchIndex(ctx context.Context, nodes []model.SearchNode) error {
65
batch := b.BIndex.NewBatch()
66
for _, node := range nodes {
67
batch.Index(uuid.NewString(), node)
68
}
69
return b.BIndex.Batch(batch)
70
}
71
72
func (b *Bleve) Get(ctx context.Context, parent string) ([]model.SearchNode, error) {
73
return nil, errs.NotSupport
74
}
75
76
func (b *Bleve) Del(ctx context.Context, prefix string) error {
77
return errs.NotSupport
78
}
79
80
func (b *Bleve) Release(ctx context.Context) error {
81
if b.BIndex != nil {
82
return b.BIndex.Close()
83
}
84
return nil
85
}
86
87
func (b *Bleve) Clear(ctx context.Context) error {
88
err := b.Release(ctx)
89
if err != nil {
90
return err
91
}
92
log.Infof("Removing old index...")
93
err = os.RemoveAll(conf.Conf.BleveDir)
94
if err != nil {
95
log.Errorf("clear bleve error: %+v", err)
96
}
97
bIndex, err := Init(&conf.Conf.BleveDir)
98
if err != nil {
99
return err
100
}
101
b.BIndex = bIndex
102
return nil
103
}
104
105
var _ searcher.Searcher = (*Bleve)(nil)
106
107