abitbol/index.go

63 lines
1.3 KiB
Go

package main
import (
"fmt"
"log"
"github.com/blevesearch/bleve"
)
// QuoteIndex index of quotes
type QuoteIndex struct {
index bleve.Index
Videos []Quote
videoByKey map[string]Quote //videoByKey[youtubeKey]
}
// Search search quote in index
func (si *QuoteIndex) Search(str string) ([]Quote, error) {
var resp []Quote
query := bleve.NewMatchQuery(str)
req := bleve.NewSearchRequest(query)
searchResults, err := si.index.Search(req)
if err != nil {
return nil, fmt.Errorf("Request error %w", err)
}
for _, hit := range searchResults.Hits {
if sound, ok := si.videoByKey[hit.ID]; ok {
resp = append(resp, sound)
}
}
if len(resp) == 0 {
return nil, fmt.Errorf("Quote not found")
}
return resp, nil
}
func indexQuotes(quotes []Quote) (*QuoteIndex, error) {
quoteMap := make(map[string]Quote)
mapping := bleve.NewIndexMapping()
mapping.DefaultAnalyzer = mapping.FieldAnalyzer("french")
index, err := bleve.NewMemOnly(mapping)
if err != nil {
return nil, fmt.Errorf("Could not creat index: %w", err)
}
for _, quote := range quotes {
if index.Index(quote.YoutubeKey, quote.Quote) != nil {
log.Printf("Error indexing %v\n", quote.Quote)
}
quoteMap[quote.YoutubeKey] = quote
}
return &QuoteIndex{
index,
quotes,
quoteMap,
}, nil
}