@@ -0,0 +1,148 @@
|
||||
package searchlogmod
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"91porn-server/common/constant"
|
||||
"91porn-server/common/db"
|
||||
"91porn-server/common/log"
|
||||
"91porn-server/models"
|
||||
"91porn-server/models/commod"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
)
|
||||
|
||||
var mdb *db.MongoDB
|
||||
|
||||
const table = models.SearchLog
|
||||
|
||||
func coll(t *db.MongoTool) *db.MongoTool {
|
||||
if t == nil {
|
||||
return mdb.Coll(table)
|
||||
}
|
||||
return t.Coll(table)
|
||||
}
|
||||
|
||||
// InitIndex 初始化索引
|
||||
func initIndex() {
|
||||
many := []mongo.IndexModel{
|
||||
{
|
||||
Keys: bson.D{{Key: "createdAt", Value: -1}},
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "uid", Value: 1}},
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "realm", Value: 1}}, //不会新建 realm 索引
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "realm", Value: 1}, {Key: "keyword", Value: 1}}, //不会新建 realm 索引
|
||||
},
|
||||
}
|
||||
if _, err := coll(nil).CreateIndex(many); err != nil {
|
||||
panic(fmt.Sprintf("%s model set index err ==>[%+v]", table, err))
|
||||
}
|
||||
}
|
||||
|
||||
// FindHotSearch 根据搜索量获取热搜排行榜
|
||||
func FindHotSearch(realm constant.RealmType, page commod.Page) ([]SearchCount, error) {
|
||||
p := []M{
|
||||
{
|
||||
"$match": M{"realm": realm},
|
||||
},
|
||||
{
|
||||
"$group": M{"_id": "$keyword", "count": M{"$sum": 1}},
|
||||
},
|
||||
{
|
||||
"$match": M{"_id": M{"$ne": ""}},
|
||||
},
|
||||
{
|
||||
"$sort": bson.D{{Key: "count", Value: -1}},
|
||||
},
|
||||
{
|
||||
"$skip": (page.PageNumber - 1) * page.PageSize,
|
||||
},
|
||||
{
|
||||
"$limit": page.PageSize,
|
||||
},
|
||||
}
|
||||
data := make([]SearchCount, 0, page.PageSize)
|
||||
if err := coll(nil).Aggregate(&data, p); err != nil {
|
||||
log.ZapLog.Error(fmt.Sprintf("models record SearchLog FindSearchCountVid fail error:%+v:", err))
|
||||
return nil, err
|
||||
}
|
||||
return data, nil
|
||||
}
|
||||
|
||||
// InsertMany InsertMany
|
||||
func InsertMany(uid uint64, realm constant.RealmType, keyWords []string) error {
|
||||
now := time.Now()
|
||||
searchLogDoc := make([]SearchLogDoc, 0, len(keyWords))
|
||||
for _, keyword := range keyWords {
|
||||
if keyword == "" {
|
||||
continue
|
||||
}
|
||||
searchLogDoc = append(searchLogDoc, SearchLogDoc{
|
||||
Realm: realm,
|
||||
UID: uid,
|
||||
Keyword: keyword,
|
||||
CreatedAt: now,
|
||||
})
|
||||
}
|
||||
if len(searchLogDoc) == 0 {
|
||||
return nil
|
||||
}
|
||||
if _, err := coll(nil).InsertMany(&searchLogDoc); err != nil {
|
||||
log.ZapLog.Error("SearchLog InsertMany error", log.E(err))
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetKeywordCountMapByTime(start time.Time, end time.Time, realm constant.RealmType) (map[string]int64, error) {
|
||||
pipeline := []M{
|
||||
{
|
||||
"$match": M{
|
||||
"createdAt": M{
|
||||
"$gte": start,
|
||||
"$lt": end,
|
||||
},
|
||||
"realm": realm,
|
||||
},
|
||||
},
|
||||
{
|
||||
"$sortByCount": "$keyword",
|
||||
},
|
||||
}
|
||||
list := []struct {
|
||||
Keyword string `bson:"_id"`
|
||||
Count int64 `bson:"count"`
|
||||
}{}
|
||||
if err := coll(nil).Aggregate(&list, pipeline); err != nil {
|
||||
return nil, fmt.Errorf("GetKeywordCountMapByTime err: %s", err.Error())
|
||||
}
|
||||
m := make(map[string]int64, len(list))
|
||||
for _, v := range list {
|
||||
m[v.Keyword] = v.Count
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
// 根据时间段获取搜索日志
|
||||
func GetSearchLogByTimeRange(start time.Time, end time.Time) (data []SearchLog, err error) {
|
||||
var query = bson.M{
|
||||
"createdAt": bson.M{"$gte": start, "$lt": end},
|
||||
}
|
||||
if err = coll(nil).Find(&data, query); err != nil {
|
||||
log.Error("models SearchLog model GetSearchLogByTimeRange error", log.E(err))
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func DeleteBeforeCreatedAt(t *db.MongoTool, tm time.Time) error {
|
||||
_, err := coll(t).DeleteMany(bson.M{"createdAt": bson.M{"$lt": tm}})
|
||||
return err
|
||||
}
|
||||
Reference in New Issue
Block a user