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 NewEngineWithIndex(idx *index.InvertedIndex) *Engine { return &Engine{ idx: idx, } } 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) } }) } var processedCount int err := ingest.WikiDump(filePath, jobQueue, func() { processedCount++ if processedCount%1000 == 0 { fmt.Printf("\rProcessed %d articles...", processedCount) } }) 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) }