diff options
| author | alex <[email protected]> | 2026-07-28 20:01:28 +0200 |
|---|---|---|
| committer | alex <[email protected]> | 2026-07-28 20:01:28 +0200 |
| commit | 95ccea8d0244e515947c335ace620838f01be60a (patch) | |
| tree | 1bce68640f72ba4c010f2abecc89d3e61460ab29 /core/search/search.go | |
| parent | c91c3afd8700138f8eb8a25a4ae422c2c9e46cea (diff) | |
| download | search-engine-95ccea8d0244e515947c335ace620838f01be60a.tar.xz search-engine-95ccea8d0244e515947c335ace620838f01be60a.zip | |
forgor :skull:
Diffstat (limited to 'core/search/search.go')
| -rw-r--r-- | core/search/search.go | 51 |
1 files changed, 26 insertions, 25 deletions
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 |
