package esmod import ( "fmt" "videoweb/app/api/proto" "videoweb/pub/common/log" "videoweb/pub/common/srvdef" "videoweb/pub/esmanager" "videoweb/pub/models/playletmod" ) // SearchPlaylet 根据关键字搜索短剧 func SearchPlaylet(content string, from int64, size int64, sort string) (int64, []*ESPlaylet, *srvdef.SrvErr) { fields := []string{ FN.ESPlaylet.Title, FN.ESPlaylet.Desc, FN.ESPlaylet.Anchor, FN.ESPlaylet.CategoryNames, FN.ESPlaylet.ThemeNames, FN.ESPlaylet.TagNames, } must := esmanager.M{ "bool": esmanager.M{ "must": esmanager.A{ {"multi_match": esmanager.M{ "query": content, "type": "best_fields", "fields": fields, }}, {"term": esmanager.M{FN.ESPlaylet.Status: playletmod.StatusUp}}, }, }, } switch sort { case string(proto.SearchSortTypeHot): must = esmanager.M{ "function_score": esmanager.M{ "query": esmanager.M{ "bool": esmanager.M{ "must": esmanager.A{ {"multi_match": esmanager.M{ "query": content, "type": "best_fields", "fields": fields, }}, {"term": esmanager.M{FN.ESPlaylet.Status: playletmod.StatusUp}}, }, }, }, "functions": esmanager.A{ esmanager.M{ "field_value_factor": esmanager.M{ "field": FN.ESPlaylet.CountBrowse, "factor": 1.0, "modifier": "none", }, }, }, "score_mode": "sum", "boost_mode": "multiply", }, } case string(proto.SearchSortTypeNew): must = esmanager.M{ "bool": esmanager.M{ "must": esmanager.A{ {"multi_match": esmanager.M{ "query": content, "type": "best_fields", "fields": fields, }}, {"term": esmanager.M{FN.ESPlaylet.Status: playletmod.StatusUp}}, }, "should": esmanager.A{ {"range": esmanager.M{FN.ESPlaylet.OnlineAt: esmanager.M{"gte": "now-30d/d", "boost": 2.0}}}, {"range": esmanager.M{FN.ESPlaylet.OnlineAt: esmanager.M{"gte": "now-180d/d", "boost": 1.5}}}, {"range": esmanager.M{FN.ESPlaylet.OnlineAt: esmanager.M{"gte": "now-365d/d", "boost": 1.1}}}, }, "minimum_should_match": 0, }, } } query := esmanager.M{ "query": must, "sort": esmanager.A{ esmanager.M{"_score": esmanager.M{"order": "desc"}}, }, "from": from, "size": size, "terminate_after": 1000, } playletList := &ESPlayletHits{} err := esmanager.Instance.Search(playletIndex, playletList, query) if err != nil { info := fmt.Sprintf("(esmod:SearchPlaylet) Search failed! err:%+v:", err) log.Warn(info, log.Any("keywords", content), log.Any("from", from), log.Any("size", size)) return 0, nil, srvdef.New(srvdef.ErrElsOperError, "", "") } total := int64(0) result := make([]*ESPlaylet, 0) if playletList != nil && playletList.Hits != nil && len(playletList.Hits) > 0 { total = playletList.Total.Value for _, item := range playletList.Hits { if item != nil && item.Source != nil { result = append(result, item.Source) } } } return total, result, nil }