You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.5 KiB
150 lines
3.5 KiB
package search |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"go-common/app/interface/main/creative/dao/tool" |
|
resMdl "go-common/app/interface/main/creative/model/resource" |
|
"go-common/app/interface/main/creative/model/search" |
|
"go-common/library/database/elastic" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
"time" |
|
) |
|
|
|
var ( |
|
// ReplyOrderMap map |
|
ReplyOrderMap = map[string]string{ |
|
"ctime": "ctime", |
|
"like": "like", |
|
"count": "count", |
|
} |
|
daysMap = map[string]int{ |
|
filterCtimeOneDayAgo: -1, |
|
filterCtimeOneWeekAgo: -7, |
|
filterCtimeOneMonthAgo: -30, |
|
filterCtimeOneYearAgo: -365, |
|
} |
|
filterCtimeOneDayAgo = "0" |
|
filterCtimeOneWeekAgo = "1" |
|
filterCtimeOneMonthAgo = "2" |
|
filterCtimeOneYearAgo = "3" |
|
) |
|
|
|
// ReplyES fn |
|
// order: ctime/like/count |
|
// filter: 1/2/3 |
|
func (d *Dao) ReplyES(c context.Context, p *search.ReplyParam) (sres *search.Replies, err error) { |
|
r := d.es.NewRequest("creative_reply").Fields( |
|
"count", |
|
"ctime", |
|
"floor", |
|
"hate", |
|
"id", |
|
"like", |
|
"message", |
|
"mid", |
|
"mtime", |
|
"o_mid", |
|
"oid", |
|
"parent", |
|
"rcount", |
|
"root", |
|
"state", |
|
"type", |
|
) |
|
idx := fmt.Sprintf("%s_%02d", "creative_reply", p.OMID%100) |
|
r.Index(idx).Pn(p.Pn).Ps(p.Ps).OrderScoreFirst(true) |
|
if p.FilterCtime != "" { |
|
if dayNum, ok := daysMap[p.FilterCtime]; ok { |
|
begin := time.Now().AddDate(0, 0, dayNum).Format("2006-01-02 15:04:05") |
|
r.WhereRange("ctime", begin, "", elastic.RangeScopeLcRc) |
|
} |
|
} |
|
if p.IsReport > 0 { |
|
r.WhereEq("isreport", p.IsReport) |
|
} |
|
// 如果指定了oid就不需要传递o_mid |
|
if p.OID > 0 { |
|
r.WhereEq("oid", p.OID) |
|
} else { |
|
r.WhereEq("o_mid", p.OMID) |
|
} |
|
if p.Kw != "" { |
|
r.WhereLike([]string{"message"}, []string{p.Kw}, true, elastic.LikeLevelLow) |
|
} |
|
if p.Type > 0 { |
|
r.WhereEq("type", p.Type) |
|
} |
|
if p.ResMdlPlat == resMdl.PlatIPad { |
|
r.WhereIn("type", []int8{search.Article}) |
|
r.WhereNot(elastic.NotTypeIn, "type") |
|
} |
|
r.WhereIn("state", []int{0, 1, 2, 5, 6}) |
|
if p.Order != "" { |
|
if o, ok := ReplyOrderMap[p.Order]; ok { |
|
r.Order(o, "desc") |
|
} else { |
|
r.Order("ctime", "desc") //默认按发布时间倒序排 |
|
} |
|
} else { |
|
r.Order("ctime", "desc") //默认按发布时间倒序排 |
|
} |
|
log.Info("ReplyES params(%+v)|p(%+v)", r.Params(), p) |
|
var res = &search.ReliesES{} |
|
if err = r.Scan(c, res); err != nil { |
|
log.Error("ReplyES r.Scan p(%+v)|error(%v)", p, err) |
|
err = ecode.CreativeSearchErr |
|
return |
|
} |
|
sres = &search.Replies{ |
|
Order: res.Order, |
|
Keyword: p.Kw, |
|
Repliers: []int64{}, |
|
DeriveOids: []int64{}, |
|
DeriveIds: []int64{}, |
|
Oids: []int64{}, |
|
TyOids: make(map[int][]int64), |
|
Result: make([]*search.Reply, 0), |
|
} |
|
for _, v := range res.Result { |
|
sres.Result = append(sres.Result, &search.Reply{ |
|
Message: v.Message, |
|
ID: v.ID, |
|
Floor: v.Floor, |
|
Count: v.Count, |
|
Root: v.Root, |
|
Oid: v.Oid, |
|
CTime: v.CTime, |
|
MTime: v.MTime, |
|
State: v.State, |
|
Parent: v.Parent, |
|
Mid: v.Mid, |
|
Like: v.Like, |
|
Type: v.Type, |
|
}) |
|
} |
|
if res.Page != nil { |
|
sres.Total = res.Page.Total |
|
sres.PageCount = res.Page.Num |
|
} |
|
replyMids := make(map[int64]int64, len(res.Result)) |
|
for _, v := range res.Result { |
|
_, ok := replyMids[v.Mid] |
|
if !ok { |
|
sres.Repliers = append(sres.Repliers, v.Mid) |
|
replyMids[v.Mid] = v.Mid |
|
} |
|
sres.Oids = append(sres.Oids, v.Oid) |
|
sres.TyOids[v.Type] = sres.Oids |
|
if v.Root > 0 { |
|
sres.DeriveOids = append(sres.DeriveOids, v.Oid) |
|
sres.DeriveIds = append(sres.DeriveIds, v.Parent) |
|
} |
|
} |
|
sres.Oids = tool.DeDuplicationSlice(sres.Oids) |
|
for k, v := range sres.TyOids { |
|
sres.TyOids[k] = tool.DeDuplicationSlice(v) |
|
} |
|
return |
|
}
|
|
|