package search import ( "searchEngine/analyzer" "searchEngine/index" ) func Search(idx *index.InvertedIndex, query string) []string { tokenizedQuery := analyzer.ProcessText(query) if len(tokenizedQuery) == 0 { return nil } idx.Mu.RLock() defer idx.Mu.RUnlock() firstToken := tokenizedQuery[0] baseIDs, exists := idx.Data[firstToken] if !exists { return nil } intersection := make([]index.Posting, len(baseIDs)) copy(intersection, baseIDs) for i := 1; i < len(tokenizedQuery); i++ { token := tokenizedQuery[i] nextIDs, exists := idx.Data[token] if !exists { return nil } lookup := make(map[int]struct{}) for _, id := range nextIDs { lookup[id.DocId] = struct{}{} } var filtered []index.Posting for _, id := range intersection { if _, found := lookup[id.DocId]; found { filtered = append(filtered, id) } } intersection = filtered } var results []string for _, id := range intersection { if title, exists := idx.DocNames[id.DocId]; exists { results = append(results, title) } } return results }