package usersearcher import ( "errors" "strconv" "91porn-server/app/appg" "91porn-server/app/service/searcher" "91porn-server/models/v/usermod" ) // UserSearcher UserSearcher type UserSearcher struct { uid uint64 } // NewUserSearcher NewUserSearcher func NewUserSearcher(uid uint64) searcher.Searcher { return &UserSearcher{ uid: uid, } } // Search Search func (u *UserSearcher) 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") } limitEx1 := opt.Limit() + 1 hasNext := false if kw == "" { //关键字为空 返回最新用户 uList, err := usermod.NewUserList(opt.Skip(), limitEx1) if err != nil { return nil, err } if len(uList) > int(opt.Limit()) { hasNext = true uList = uList[:opt.Limit()] } userResList := searcher.MapToUserResList(uList, u.uid) return &Result{userResList, hasNext}, nil } userList := make([]*usermod.User, 0, limitEx1) uid, err := strconv.ParseUint(kw, 10, 64) var esHasNext bool if err == nil { //能解析成Int 通过uid搜索 user, err := usermod.FindUserByUID(uid) if err != nil { return nil, err } if user != nil { userList = append(userList, user) } } else { //通过用户名搜索 var uList []*usermod.User if appg.Conf.Elastic.IsActive { uList, esHasNext, err = esSearch(kw, opt) } else { uList, err = usermod.FindUsersByKeyword(kw, opt.Skip(), limitEx1) } if err != nil { return nil, err } userList = append(userList, uList...) } if len(userList) == 0 { return &Result{[]UserRes{}, false}, nil } if len(userList) > int(opt.Limit()) { hasNext = true userList = userList[:opt.Limit()] } if appg.Conf.Elastic.IsActive { hasNext = esHasNext } userResList := searcher.MapToUserResList(userList, u.uid) return &Result{userResList, hasNext}, nil } func esSearch(keyword string, opt searcher.Opter) (users []*usermod.User, hasNext bool, err error) { esUsers, err := usermod.Search(keyword, opt.Skip(), opt.Limit()+1) if err != nil { return } if len(esUsers) == 0 { return } uidList := make([]uint64, len(esUsers)) for i, v := range esUsers { uidList[i] = v.Source.UID } hasNext = len(esUsers) > int(opt.Limit()) uMap, err := usermod.FindUsersMapByUID(uidList) if err != nil || uMap == nil { return } users = make([]*usermod.User, 0, len(esUsers)) for _, v := range esUsers { if u, ok := uMap[v.Source.UID]; ok { users = append(users, u) } } return }