149 lines
3.3 KiB
Go
149 lines
3.3 KiB
Go
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
|
|
}
|