reply.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package search
  2. import (
  3. "context"
  4. "fmt"
  5. "go-common/app/interface/main/creative/dao/tool"
  6. resMdl "go-common/app/interface/main/creative/model/resource"
  7. "go-common/app/interface/main/creative/model/search"
  8. "go-common/library/database/elastic"
  9. "go-common/library/ecode"
  10. "go-common/library/log"
  11. "time"
  12. )
  13. var (
  14. // ReplyOrderMap map
  15. ReplyOrderMap = map[string]string{
  16. "ctime": "ctime",
  17. "like": "like",
  18. "count": "count",
  19. }
  20. daysMap = map[string]int{
  21. filterCtimeOneDayAgo: -1,
  22. filterCtimeOneWeekAgo: -7,
  23. filterCtimeOneMonthAgo: -30,
  24. filterCtimeOneYearAgo: -365,
  25. }
  26. filterCtimeOneDayAgo = "0"
  27. filterCtimeOneWeekAgo = "1"
  28. filterCtimeOneMonthAgo = "2"
  29. filterCtimeOneYearAgo = "3"
  30. )
  31. // ReplyES fn
  32. // order: ctime/like/count
  33. // filter: 1/2/3
  34. func (d *Dao) ReplyES(c context.Context, p *search.ReplyParam) (sres *search.Replies, err error) {
  35. r := d.es.NewRequest("creative_reply").Fields(
  36. "count",
  37. "ctime",
  38. "floor",
  39. "hate",
  40. "id",
  41. "like",
  42. "message",
  43. "mid",
  44. "mtime",
  45. "o_mid",
  46. "oid",
  47. "parent",
  48. "rcount",
  49. "root",
  50. "state",
  51. "type",
  52. )
  53. idx := fmt.Sprintf("%s_%02d", "creative_reply", p.OMID%100)
  54. r.Index(idx).Pn(p.Pn).Ps(p.Ps).OrderScoreFirst(true)
  55. if p.FilterCtime != "" {
  56. if dayNum, ok := daysMap[p.FilterCtime]; ok {
  57. begin := time.Now().AddDate(0, 0, dayNum).Format("2006-01-02 15:04:05")
  58. r.WhereRange("ctime", begin, "", elastic.RangeScopeLcRc)
  59. }
  60. }
  61. if p.IsReport > 0 {
  62. r.WhereEq("isreport", p.IsReport)
  63. }
  64. // 如果指定了oid就不需要传递o_mid
  65. if p.OID > 0 {
  66. r.WhereEq("oid", p.OID)
  67. } else {
  68. r.WhereEq("o_mid", p.OMID)
  69. }
  70. if p.Kw != "" {
  71. r.WhereLike([]string{"message"}, []string{p.Kw}, true, elastic.LikeLevelLow)
  72. }
  73. if p.Type > 0 {
  74. r.WhereEq("type", p.Type)
  75. }
  76. if p.ResMdlPlat == resMdl.PlatIPad {
  77. r.WhereIn("type", []int8{search.Article})
  78. r.WhereNot(elastic.NotTypeIn, "type")
  79. }
  80. r.WhereIn("state", []int{0, 1, 2, 5, 6})
  81. if p.Order != "" {
  82. if o, ok := ReplyOrderMap[p.Order]; ok {
  83. r.Order(o, "desc")
  84. } else {
  85. r.Order("ctime", "desc") //默认按发布时间倒序排
  86. }
  87. } else {
  88. r.Order("ctime", "desc") //默认按发布时间倒序排
  89. }
  90. log.Info("ReplyES params(%+v)|p(%+v)", r.Params(), p)
  91. var res = &search.ReliesES{}
  92. if err = r.Scan(c, res); err != nil {
  93. log.Error("ReplyES r.Scan p(%+v)|error(%v)", p, err)
  94. err = ecode.CreativeSearchErr
  95. return
  96. }
  97. sres = &search.Replies{
  98. Order: res.Order,
  99. Keyword: p.Kw,
  100. Repliers: []int64{},
  101. DeriveOids: []int64{},
  102. DeriveIds: []int64{},
  103. Oids: []int64{},
  104. TyOids: make(map[int][]int64),
  105. Result: make([]*search.Reply, 0),
  106. }
  107. for _, v := range res.Result {
  108. sres.Result = append(sres.Result, &search.Reply{
  109. Message: v.Message,
  110. ID: v.ID,
  111. Floor: v.Floor,
  112. Count: v.Count,
  113. Root: v.Root,
  114. Oid: v.Oid,
  115. CTime: v.CTime,
  116. MTime: v.MTime,
  117. State: v.State,
  118. Parent: v.Parent,
  119. Mid: v.Mid,
  120. Like: v.Like,
  121. Type: v.Type,
  122. })
  123. }
  124. if res.Page != nil {
  125. sres.Total = res.Page.Total
  126. sres.PageCount = res.Page.Num
  127. }
  128. replyMids := make(map[int64]int64, len(res.Result))
  129. for _, v := range res.Result {
  130. _, ok := replyMids[v.Mid]
  131. if !ok {
  132. sres.Repliers = append(sres.Repliers, v.Mid)
  133. replyMids[v.Mid] = v.Mid
  134. }
  135. sres.Oids = append(sres.Oids, v.Oid)
  136. sres.TyOids[v.Type] = sres.Oids
  137. if v.Root > 0 {
  138. sres.DeriveOids = append(sres.DeriveOids, v.Oid)
  139. sres.DeriveIds = append(sres.DeriveIds, v.Parent)
  140. }
  141. }
  142. sres.Oids = tool.DeDuplicationSlice(sres.Oids)
  143. for k, v := range sres.TyOids {
  144. sres.TyOids[k] = tool.DeDuplicationSlice(v)
  145. }
  146. return
  147. }