package core import ( "fmt" "searchEngine/core/analyzer" "searchEngine/core/index" "searchEngine/core/ingest" "searchEngine/core/search" "sync" ) type Engine struct { idx *index.InvertedIndex } func NewEngine() *Engine { return &Engine{ idx: index.New(), } } func (e *Engine) Index() *index.InvertedIndex { return e.idx } func (e *Engine) IndexDump(filePath string, numWorkers int) error { if numWorkers <= 0 { numWorkers = 4 } jobQueue := make(chan ingest.Page, 100) var wg sync.WaitGroup for i := 0; i < numWorkers; i++ { wg.Go(func() { for page := range jobQueue { tokens := analyzer.ProcessText(page.Text) e.idx.Add(page.Id, page.Title, tokens) } }) } err := ingest.IngestWikiDump(filePath, jobQueue) close(jobQueue) wg.Wait() if err != nil { return fmt.Errorf("failed to ingest wiki dump: %w", err) } return nil } func (e *Engine) Search(query string) []string { return search.Search(e.idx, query) }