Files
huangguo_server/app/service/searcher/vidrichsearcher/vidRichSearcher.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

77 lines
1.8 KiB
Go

package vidrichsearcher
import (
"errors"
"91porn-server/app/appg"
"91porn-server/app/service/searcher"
"91porn-server/app/service/searcher/vidhotsearcher"
"91porn-server/models/v/vidmod"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type ObjectID = primitive.ObjectID
// VidRichSearcher VidRichSearcher
type VidRichSearcher struct {
uid uint64
}
// NewVidRichSearcher NewVidRichSearcher
func NewVidRichSearcher(uid uint64) searcher.Searcher {
return &VidRichSearcher{
uid: uid,
}
}
// Search Search
func (v *VidRichSearcher) 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.NewRichVidHotSearcher(v.uid).Search(nil, opt)
}
limitEx1 := opt.Limit() + 1
var vidList []vidmod.ObjectID
if appg.Conf.Elastic.IsActive {
vidList, err = esSearch(kw, opt)
} else {
vidList, err = searcher.VideoListByKeyword(kw, opt.Skip(), limitEx1)
}
if err != nil {
return nil, err
}
if len(vidList) == 0 {
return &Result{[]RichVidRes{}, false}, nil
}
hasNext := false
if len(vidList) > int(opt.Limit()) {
hasNext = true
vidList = vidList[:opt.Limit()]
}
richVideoResList, err := searcher.GetRichVideoResListForSearch(v.uid, vidList)
if err != nil {
return nil, err
}
return &Result{richVideoResList, hasNext}, nil
}
func esSearch(keyword string, opt searcher.Opter) ([]vidmod.ObjectID, error) {
esVideos, err := vidmod.Search(keyword, opt.Skip(), opt.Limit())
if err != nil {
return nil, err
}
esVideosLen := len(esVideos)
if esVideosLen == 0 {
return nil, nil
}
videosID := make([]vidmod.ObjectID, esVideosLen)
for i, v := range esVideos {
videosID[i] = v.ID
}
return videosID, nil
}