64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
package fictionsearcher
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"91porn-server/app/appg"
|
|
"91porn-server/app/service/searcher"
|
|
"91porn-server/models/v/fictionmod"
|
|
)
|
|
|
|
// FictionSearcher FictionSearcher
|
|
type FictionSearcher struct {
|
|
uid *uint64
|
|
}
|
|
|
|
// NewFictionSearcher NewFictionSearcher
|
|
func NewFictionSearcher(uid *uint64) searcher.Searcher {
|
|
return &FictionSearcher{
|
|
uid: uid,
|
|
}
|
|
}
|
|
|
|
// Search Search
|
|
func (t *FictionSearcher) Search(keywrod searcher.KeyWorder, opt searcher.Opter) (result searcher.Resulter, err error) {
|
|
var fiction []fictionmod.FictionBase
|
|
kw, ok := keywrod.Get().(string)
|
|
if !ok {
|
|
return nil, errors.New("keyword type error")
|
|
}
|
|
hasNext := false
|
|
if kw == "" { //关键字为空,热搜
|
|
fiction, hasNext, err = fictionmod.GetNew(opt)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &Result{fiction, hasNext}, nil
|
|
}
|
|
if appg.Conf.Elastic.IsActive {
|
|
fiction, err = esSearch(kw, opt)
|
|
if len(fiction) > int(opt.Limit()) {
|
|
hasNext = true
|
|
fiction = fiction[:opt.Limit()]
|
|
}
|
|
} else {
|
|
fiction, hasNext, err = fictionmod.GetNew(opt)
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &Result{fiction, hasNext}, nil
|
|
}
|
|
|
|
func esSearch(keyword string, opt searcher.Opter) (data []fictionmod.FictionBase, err error) {
|
|
fiction, err := fictionmod.Search(keyword, opt.Skip(), opt.Limit()+1)
|
|
if err != nil {
|
|
return
|
|
}
|
|
data = make([]fictionmod.FictionBase, len(fiction))
|
|
for i := range fiction {
|
|
data[i] = fiction[i].Source
|
|
}
|
|
return
|
|
}
|