From 486db58e46d85fc6a82b1d5c5ccff92170c8017c Mon Sep 17 00:00:00 2001 From: nyne Date: Sun, 1 Jun 2025 22:12:25 +0800 Subject: [PATCH] Improve search --- server/dao/resource.go | 58 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/server/dao/resource.go b/server/dao/resource.go index 940f3ae..7cad2b8 100644 --- a/server/dao/resource.go +++ b/server/dao/resource.go @@ -129,9 +129,65 @@ func DeleteResource(id uint) error { }) } +func splitQuery(query string) []string { + var keywords []string + + query = strings.TrimSpace(query) + if query == "" { + return keywords + } + + l, r := 0, 0 + inQuote := false + quoteChar := byte(0) + + for r < len(query) { + if (query[r] == '"' || query[r] == '\'') && (r == 0 || query[r-1] != '\\') { + if !inQuote { + inQuote = true + quoteChar = query[r] + l = r + 1 + } else if query[r] == quoteChar { + if r > l { + keywords = append(keywords, strings.TrimSpace(query[l:r])) + } + inQuote = false + r++ + l = r + continue + } + } else if !inQuote && query[r] == ' ' { + if r > l { + keywords = append(keywords, strings.TrimSpace(query[l:r])) + } + for r < len(query) && query[r] == ' ' { + r++ + } + l = r + continue + } + + r++ + } + + if l < len(query) { + keywords = append(keywords, strings.TrimSpace(query[l:r])) + } + + return keywords +} + func Search(query string, page, pageSize int) ([]model.Resource, int, error) { query = strings.TrimSpace(query) - keywords := strings.Split(query, " ") + + if len([]rune(query)) < 20 { + tag, err := GetTagByName(query) + if err == nil { + return GetResourceByTag(tag.ID, page, pageSize) + } + } + + keywords := splitQuery(query) resource, err := searchWithKeyword(keywords[0]) if err != nil { return nil, 0, err