|
package meilisearch |
|
|
|
import ( |
|
"errors" |
|
"fmt" |
|
"github.com/alist-org/alist/v3/internal/conf" |
|
"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/meilisearch/meilisearch-go" |
|
) |
|
|
|
var config = searcher.Config{ |
|
Name: "meilisearch", |
|
AutoUpdate: true, |
|
} |
|
|
|
func init() { |
|
searcher.RegisterSearcher(config, func() (searcher.Searcher, error) { |
|
m := Meilisearch{ |
|
Client: meilisearch.NewClient(meilisearch.ClientConfig{ |
|
Host: conf.Conf.Meilisearch.Host, |
|
APIKey: conf.Conf.Meilisearch.APIKey, |
|
}), |
|
IndexUid: conf.Conf.Meilisearch.IndexPrefix + "alist", |
|
FilterableAttributes: []string{"parent", "is_dir", "name"}, |
|
SearchableAttributes: []string{"name"}, |
|
} |
|
|
|
_, err := m.Client.GetIndex(m.IndexUid) |
|
if err != nil { |
|
var mErr *meilisearch.Error |
|
ok := errors.As(err, &mErr) |
|
if ok && mErr.MeilisearchApiError.Code == "index_not_found" { |
|
task, err := m.Client.CreateIndex(&meilisearch.IndexConfig{ |
|
Uid: m.IndexUid, |
|
PrimaryKey: "id", |
|
}) |
|
if err != nil { |
|
return nil, err |
|
} |
|
forTask, err := m.Client.WaitForTask(task.TaskUID) |
|
if err != nil { |
|
return nil, err |
|
} |
|
if forTask.Status != meilisearch.TaskStatusSucceeded { |
|
return nil, fmt.Errorf("index creation failed, task status is %s", forTask.Status) |
|
} |
|
} else { |
|
return nil, err |
|
} |
|
} |
|
attributes, err := m.Client.Index(m.IndexUid).GetFilterableAttributes() |
|
if err != nil { |
|
return nil, err |
|
} |
|
if attributes == nil || !utils.SliceAllContains(*attributes, m.FilterableAttributes...) { |
|
_, err = m.Client.Index(m.IndexUid).UpdateFilterableAttributes(&m.FilterableAttributes) |
|
if err != nil { |
|
return nil, err |
|
} |
|
} |
|
|
|
attributes, err = m.Client.Index(m.IndexUid).GetSearchableAttributes() |
|
if err != nil { |
|
return nil, err |
|
} |
|
if attributes == nil || !utils.SliceAllContains(*attributes, m.SearchableAttributes...) { |
|
_, err = m.Client.Index(m.IndexUid).UpdateSearchableAttributes(&m.SearchableAttributes) |
|
if err != nil { |
|
return nil, err |
|
} |
|
} |
|
|
|
pagination, err := m.Client.Index(m.IndexUid).GetPagination() |
|
if err != nil { |
|
return nil, err |
|
} |
|
if pagination.MaxTotalHits != int64(model.MaxInt) { |
|
_, err := m.Client.Index(m.IndexUid).UpdatePagination(&meilisearch.Pagination{ |
|
MaxTotalHits: int64(model.MaxInt), |
|
}) |
|
if err != nil { |
|
return nil, err |
|
} |
|
} |
|
return &m, nil |
|
}) |
|
} |
|
|