🎨 Improve Add to Database search sorting https://github.com/siyuan-note/siyuan/issues/10952

This commit is contained in:
Daniel 2024-04-09 21:26:41 +08:00
parent 225930d3cf
commit c4d2f9e706
No known key found for this signature in database
GPG Key ID: 86211BA83DF03017

View File

@ -196,20 +196,19 @@ func SearchAttributeView(keyword string) (ret []*SearchAttributeViewResult) {
keyword = strings.TrimSpace(keyword) keyword = strings.TrimSpace(keyword)
type result struct { type result struct {
AvID string AvID string
AvName string AvName string
Score float64 AvUpdated int64
Score float64
} }
var avs []*result var avs []*result
avDir := filepath.Join(util.DataDir, "storage", "av") avDir := filepath.Join(util.DataDir, "storage", "av")
const limit = 16
entries, err := os.ReadDir(avDir) entries, err := os.ReadDir(avDir)
if nil != err { if nil != err {
logging.LogErrorf("read directory [%s] failed: %s", avDir, err) logging.LogErrorf("read directory [%s] failed: %s", avDir, err)
return return
} }
count := 0
for _, entry := range entries { for _, entry := range entries {
if entry.IsDir() { if entry.IsDir() {
continue continue
@ -221,29 +220,39 @@ func SearchAttributeView(keyword string) (ret []*SearchAttributeViewResult) {
} }
name, _ := av.GetAttributeViewNameByPath(filepath.Join(avDir, entry.Name())) name, _ := av.GetAttributeViewNameByPath(filepath.Join(avDir, entry.Name()))
if "" == name { info, _ := entry.Info()
continue if "" != keyword {
} if strings.Contains(strings.ToLower(name), strings.ToLower(keyword)) {
score := smetrics.JaroWinkler(name, keyword, 0.7, 4)
if strings.Contains(strings.ToLower(name), strings.ToLower(keyword)) { a := &result{AvID: id, AvName: name, Score: score}
score := smetrics.JaroWinkler(name, keyword, 0.7, 4) if nil != info && !info.ModTime().IsZero() {
avs = append(avs, &result{AvID: id, AvName: name, Score: score}) a.AvUpdated = info.ModTime().UnixMilli()
count++ }
if "" == keyword && limit <= count { avs = append(avs, a)
break
} }
} else {
a := &result{AvID: id, AvName: name}
if nil != info && !info.ModTime().IsZero() {
a.AvUpdated = info.ModTime().UnixMilli()
}
avs = append(avs, a)
} }
} }
sort.Slice(avs, func(i, j int) bool { return avs[i].Score > avs[j].Score }) if "" == keyword {
if limit < len(avs) { sort.Slice(avs, func(i, j int) bool { return avs[i].AvUpdated > avs[j].AvUpdated })
avs = avs[:limit] } else {
sort.Slice(avs, func(i, j int) bool { return avs[i].Score > avs[j].Score })
}
if 16 < len(avs) {
avs = avs[:16]
} }
var avIDs []string var avIDs []string
for _, av := range avs { for _, a := range avs {
avIDs = append(avIDs, av.AvID) avIDs = append(avIDs, a.AvID)
} }
blockIDs := treenode.BatchGetMirrorAttrViewBlockIDs(avIDs) blockIDs := treenode.BatchGetMirrorAttrViewBlockIDs(avIDs)
trees := map[string]*parse.Tree{} trees := map[string]*parse.Tree{}
for _, blockID := range blockIDs { for _, blockID := range blockIDs {