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 }