From 95ccea8d0244e515947c335ace620838f01be60a Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 28 Jul 2026 20:01:28 +0200 Subject: forgor :skull: --- core/search/search.go | 51 ++++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) (limited to 'core/search') diff --git a/core/search/search.go b/core/search/search.go index e159d43..721574c 100644 --- a/core/search/search.go +++ b/core/search/search.go @@ -1,14 +1,16 @@ package search import ( + "cmp" "searchEngine/core/analyzer" "searchEngine/core/index" + "searchEngine/core/scoring" "slices" ) type Result struct { DocID int - Score int + Score float64 } func Search(idx *index.InvertedIndex, query string) []string { @@ -20,45 +22,44 @@ func Search(idx *index.InvertedIndex, query string) []string { idx.Mu.RLock() defer idx.Mu.RUnlock() - firstToken := tokenizedQuery[0] - basePostings, exists := idx.Data[firstToken] - if !exists { - return nil - } + totalDocs := len(idx.DocNames) + docMatchCounts := make(map[int]int) + scores := make(map[int]float64) - scores := make(map[int]int) - for _, p := range basePostings { - scores[p.DocId] = p.BodyCount + uniqueMap := make(map[string]bool) + var uniqueTokens []string + for _, token := range tokenizedQuery { + if !uniqueMap[token] { + uniqueMap[token] = true + uniqueTokens = append(uniqueTokens, token) + } } - for i := 1; i < len(tokenizedQuery); i++ { - token := tokenizedQuery[i] - nextPostings, exists := idx.Data[token] + for _, token := range tokenizedQuery { + postings, exists := idx.Data[token] if !exists { return nil } - lookup := make(map[int]int) - for _, p := range nextPostings { - lookup[p.DocId] = p.BodyCount - } + docFrequency := len(postings) + idf := scoring.CalculateIDF(totalDocs, docFrequency) - newScores := make(map[int]int) - for docID, currentScore := range scores { - if nextCount, found := lookup[docID]; found { - newScores[docID] = currentScore + nextCount - } + for _, p := range postings { + docMatchCounts[p.DocId]++ + termScore := scoring.ScoreTFIDF(p, idf) + scores[p.DocId] += termScore } - scores = newScores } var results []Result - for docID, score := range scores { - results = append(results, Result{DocID: docID, Score: score}) + for docID, count := range docMatchCounts { + if count == len(uniqueTokens) { + results = append(results, Result{DocID: docID, Score: scores[docID]}) + } } slices.SortFunc(results, func(a, b Result) int { - return b.Score - a.Score + return cmp.Compare(b.Score, a.Score) }) var titles []string -- cgit v1.2.3