summaryrefslogtreecommitdiff
path: root/core/search/search.go
diff options
context:
space:
mode:
authoralex <[email protected]>2026-07-28 20:01:28 +0200
committeralex <[email protected]>2026-07-28 20:01:28 +0200
commit95ccea8d0244e515947c335ace620838f01be60a (patch)
tree1bce68640f72ba4c010f2abecc89d3e61460ab29 /core/search/search.go
parentc91c3afd8700138f8eb8a25a4ae422c2c9e46cea (diff)
downloadsearch-engine-95ccea8d0244e515947c335ace620838f01be60a.tar.xz
search-engine-95ccea8d0244e515947c335ace620838f01be60a.zip
forgor :skull:
Diffstat (limited to 'core/search/search.go')
-rw-r--r--core/search/search.go51
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