All checks were successful
continuous-integration/drone/push Build is passing
63 lines
1.3 KiB
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
|
|
}
|