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 }