105 lines
2.9 KiB
Go
105 lines
2.9 KiB
Go
package esmod
|
|
|
|
import (
|
|
"fmt"
|
|
"videoweb/app/api/proto"
|
|
"videoweb/pub/common/log"
|
|
"videoweb/pub/common/srvdef"
|
|
"videoweb/pub/esmanager"
|
|
)
|
|
|
|
// SearchActress 根据关键字搜索媒体
|
|
func SearchActress(content string, from int64, size int64, sort string) (int64, []*ESActress, *srvdef.SrvErr) {
|
|
fields := []string{FN.ESActress.Alias, FN.ESActress.Office, FN.ESActress.Region, FN.ESActress.Desc}
|
|
must := esmanager.M{
|
|
"bool": esmanager.M{
|
|
"must": esmanager.A{
|
|
{"multi_match": esmanager.M{
|
|
"query": content,
|
|
"type": "best_fields",
|
|
"fields": fields},
|
|
},
|
|
{"term": esmanager.M{FN.ESActress.Status: true}},
|
|
},
|
|
},
|
|
}
|
|
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.ESActress.Status: true}},
|
|
},
|
|
},
|
|
},
|
|
"functions": esmanager.A{
|
|
esmanager.M{
|
|
"field_value_factor": esmanager.M{
|
|
"field": FN.ESActress.Real.WatchTimes,
|
|
"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.ESActress.Status: true}},
|
|
},
|
|
"should": esmanager.A{
|
|
{"range": esmanager.M{FN.ESActress.CreatedAt: esmanager.M{"gte": "now-30d/d", "boost": 2.0}}}, //7天内提升4倍权重
|
|
{"range": esmanager.M{FN.ESActress.CreatedAt: esmanager.M{"gte": "now-180d/d", "boost": 1.5}}}, // 30天内提升3倍权重
|
|
{"range": esmanager.M{FN.ESActress.CreatedAt: esmanager.M{"gte": "now-365d/d", "boost": 1.1}}}, // 90天内提升1.5倍权重
|
|
},
|
|
"minimum_should_match": 0, // 允许不匹配任何should条件
|
|
},
|
|
}
|
|
}
|
|
|
|
query := esmanager.M{
|
|
"query": must,
|
|
"sort": esmanager.A{
|
|
esmanager.M{"_score": esmanager.M{"order": "desc"}},
|
|
},
|
|
"from": from,
|
|
"size": size,
|
|
}
|
|
|
|
actressList := &ESActressHits{}
|
|
err := esmanager.Instance.Search(actressIndex, actressList, query)
|
|
if err != nil {
|
|
info := fmt.Sprintf(
|
|
"(esmod:SearchActress) 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)
|
|
rslData := make([]*ESActress, 0)
|
|
if actressList != nil && actressList.Hits != nil && len(actressList.Hits) > 0 {
|
|
total = actressList.Total.Value
|
|
for _, video := range actressList.Hits {
|
|
rslData = append(rslData, video.Source)
|
|
}
|
|
}
|
|
return total, rslData, nil
|
|
} |