From 45beaced89dc1b86ec4e71be5a589b09fec29b79 Mon Sep 17 00:00:00 2001 From: nyne Date: Wed, 10 Sep 2025 20:06:46 +0800 Subject: [PATCH] Check stopwords --- server/search/resource.go | 11 +++++++++++ server/search/search_test.go | 20 ++++++++++++++++++++ server/service/resource.go | 3 +++ 3 files changed, 34 insertions(+) diff --git a/server/search/resource.go b/server/search/resource.go index 0e5a110..9c33806 100644 --- a/server/search/resource.go +++ b/server/search/resource.go @@ -101,3 +101,14 @@ func SearchResource(keyword string) ([]uint, error) { return results, nil } + +func IsStopWord(word string) bool { + mapping := bleve.NewIndexMapping() + analyzerName := mapping.DefaultAnalyzer + analyzer := mapping.AnalyzerNamed(analyzerName) + if analyzer == nil { + return false + } + tokens := analyzer.Analyze([]byte(word)) + return len(tokens) == 0 +} diff --git a/server/search/search_test.go b/server/search/search_test.go index 6a41988..23fa9a9 100644 --- a/server/search/search_test.go +++ b/server/search/search_test.go @@ -163,3 +163,23 @@ func TestSearchResource(t *testing.T) { }) } } + +func TestIsStopWord(t *testing.T) { + Init() + defer TearDown() + + stopWords := []string{"the", "is", "at", "which", "on", "and", "a", "an", "in", "to", "of"} + nonStopWords := []string{"adventure", "mystery", "romance", "sci-fi", "comedy", "action", "horror"} + + for _, word := range stopWords { + if !IsStopWord(word) { + t.Errorf("Expected '%s' to be identified as a stop word", word) + } + } + + for _, word := range nonStopWords { + if IsStopWord(word) { + t.Errorf("Expected '%s' to not be identified as a stop word", word) + } + } +} diff --git a/server/service/resource.go b/server/service/resource.go index 86ea57d..ea13c93 100644 --- a/server/service/resource.go +++ b/server/service/resource.go @@ -317,6 +317,9 @@ func SearchResource(query string, page int) ([]model.ResourceView, int, error) { if err != nil { return nil, 0, err } + if len(res) == 0 && search.IsStopWord(keyword) { + continue + } if first { temp = utils.RemoveDuplicate(res) first = false