Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/search/meilisearch/init.go
1562 views
1
package meilisearch
2
3
import (
4
"errors"
5
"fmt"
6
"github.com/alist-org/alist/v3/internal/conf"
7
"github.com/alist-org/alist/v3/internal/model"
8
"github.com/alist-org/alist/v3/internal/search/searcher"
9
"github.com/alist-org/alist/v3/pkg/utils"
10
"github.com/meilisearch/meilisearch-go"
11
)
12
13
var config = searcher.Config{
14
Name: "meilisearch",
15
AutoUpdate: true,
16
}
17
18
func init() {
19
searcher.RegisterSearcher(config, func() (searcher.Searcher, error) {
20
m := Meilisearch{
21
Client: meilisearch.NewClient(meilisearch.ClientConfig{
22
Host: conf.Conf.Meilisearch.Host,
23
APIKey: conf.Conf.Meilisearch.APIKey,
24
}),
25
IndexUid: conf.Conf.Meilisearch.IndexPrefix + "alist",
26
FilterableAttributes: []string{"parent", "is_dir", "name"},
27
SearchableAttributes: []string{"name"},
28
}
29
30
_, err := m.Client.GetIndex(m.IndexUid)
31
if err != nil {
32
var mErr *meilisearch.Error
33
ok := errors.As(err, &mErr)
34
if ok && mErr.MeilisearchApiError.Code == "index_not_found" {
35
task, err := m.Client.CreateIndex(&meilisearch.IndexConfig{
36
Uid: m.IndexUid,
37
PrimaryKey: "id",
38
})
39
if err != nil {
40
return nil, err
41
}
42
forTask, err := m.Client.WaitForTask(task.TaskUID)
43
if err != nil {
44
return nil, err
45
}
46
if forTask.Status != meilisearch.TaskStatusSucceeded {
47
return nil, fmt.Errorf("index creation failed, task status is %s", forTask.Status)
48
}
49
} else {
50
return nil, err
51
}
52
}
53
attributes, err := m.Client.Index(m.IndexUid).GetFilterableAttributes()
54
if err != nil {
55
return nil, err
56
}
57
if attributes == nil || !utils.SliceAllContains(*attributes, m.FilterableAttributes...) {
58
_, err = m.Client.Index(m.IndexUid).UpdateFilterableAttributes(&m.FilterableAttributes)
59
if err != nil {
60
return nil, err
61
}
62
}
63
64
attributes, err = m.Client.Index(m.IndexUid).GetSearchableAttributes()
65
if err != nil {
66
return nil, err
67
}
68
if attributes == nil || !utils.SliceAllContains(*attributes, m.SearchableAttributes...) {
69
_, err = m.Client.Index(m.IndexUid).UpdateSearchableAttributes(&m.SearchableAttributes)
70
if err != nil {
71
return nil, err
72
}
73
}
74
75
pagination, err := m.Client.Index(m.IndexUid).GetPagination()
76
if err != nil {
77
return nil, err
78
}
79
if pagination.MaxTotalHits != int64(model.MaxInt) {
80
_, err := m.Client.Index(m.IndexUid).UpdatePagination(&meilisearch.Pagination{
81
MaxTotalHits: int64(model.MaxInt),
82
})
83
if err != nil {
84
return nil, err
85
}
86
}
87
return &m, nil
88
})
89
}
90
91