73 lines
1.9 KiB
Go
73 lines
1.9 KiB
Go
package vidsearcher
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"91porn-server/app/appg"
|
|
"91porn-server/app/service/searcher"
|
|
"91porn-server/app/service/searcher/vidhotsearcher"
|
|
"91porn-server/models/v/vidmod"
|
|
)
|
|
|
|
// VidSearcher VidSearcher
|
|
type VidSearcher struct {
|
|
uid uint64
|
|
vidType string
|
|
sortType int
|
|
}
|
|
|
|
// NewVidSearcher NewVidSearcher
|
|
func NewVidSearcher(uid uint64, vidType string, sortType int) searcher.Searcher {
|
|
return &VidSearcher{uid: uid, vidType: vidType, sortType: sortType}
|
|
}
|
|
|
|
// Search Search
|
|
func (v *VidSearcher) Search(keyword searcher.KeyWorder, opt searcher.Opter) (result searcher.Resulter, err error) {
|
|
kw, ok := keyword.Get().(string)
|
|
if !ok {
|
|
return nil, errors.New("keyword type error")
|
|
}
|
|
if kw == "" { //关键字为空,热搜
|
|
return vidhotsearcher.NewVidHotSearcher(v.uid).Search(nil, opt)
|
|
}
|
|
limitEx1 := opt.Limit() + 1
|
|
var vidList []vidmod.ObjectID
|
|
if appg.Conf.Elastic.IsActive { // 使用ES搜索视频
|
|
vidList, err = esSearch(kw, v.vidType, opt, v.sortType)
|
|
} else {
|
|
vidList, err = searcher.VideoListByKeyword(kw, opt.Skip(), limitEx1)
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(vidList) == 0 {
|
|
return &Result{[]VideoRes{}, false}, nil
|
|
}
|
|
hasNext := false
|
|
if len(vidList) > int(opt.Limit()) {
|
|
hasNext = true
|
|
vidList = vidList[:opt.Limit()]
|
|
}
|
|
videoResList, err := searcher.GetVideoResListForSearch(v.uid, vidList)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &Result{videoResList, hasNext}, nil
|
|
}
|
|
|
|
func esSearch(keyword string, vidType string, opt searcher.Opter, sortType int) ([]vidmod.ObjectID, error) {
|
|
esVideos, err := vidmod.DirectSearch(keyword, vidType, sortType, opt.Skip(), opt.Limit()+1)
|
|
if err != nil {
|
|
return nil, nil
|
|
}
|
|
esVideosLen := len(esVideos)
|
|
if esVideosLen == 0 {
|
|
return nil, err
|
|
}
|
|
videosID := make([]vidmod.ObjectID, esVideosLen)
|
|
for i, v := range esVideos {
|
|
videosID[i] = v.ID
|
|
}
|
|
return videosID, nil
|
|
}
|