123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- package main
- import (
- util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
- "jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
- "mobile_tag/oss"
- "regexp"
- "sort"
- "strings"
- )
- type TagMatching struct {
- tagName string //标签名称
- tagCode string //标签值(保存)
- matchField []string //关键词匹配字段,title,detail
- matchKey string //匹配的词语,多个使用逗号连接,"部队,国防,军事,军用"
- matchKeyReg []*RegexpInfo //关键词的正则
- addField []string //附加词匹配字段
- addKey string //附件词匹配关键词
- addKeyReg []*RegexpInfo //附加次的正则
- excludeField []string //排除词匹配字段
- excludeKey string //排除词匹配词
- excludeKeyReg []*RegexpInfo //排除词正则
- //clearKey []string //清理词匹配字段跟关键词一样
- }
- type RegexpInfo struct {
- keyStr string
- regs *regexp.Regexp
- }
- // GetRegex 根据关键词或者对应正则
- func GetRegex(key string) []*RegexpInfo {
- var infos []*RegexpInfo
- for _, s := range strings.Split(key, ",") {
- if strings.Contains(s, "&&") || strings.Contains(s, "&!") {
- info := &RegexpInfo{
- keyStr: s,
- regs: nil,
- }
- infos = append(infos, info)
- } else {
- info := &RegexpInfo{
- keyStr: s,
- regs: regexp.MustCompile(".*(?i)" + s + ".*"),
- }
- infos = append(infos, info)
- }
- }
- return infos
- }
- // TaskTags 根据数据和正则规则,验证数据标签
- func TaskTags(tmp map[string]interface{}, regs []TagMatching) (tags []string, keyWord, addWord string) {
- // 在匹配字段里,比如标题满足了关键词,详情满足附加词,关键词的匹配字段含有标题,附加词的匹配字段含有详情;就符合条件
- Loop:
- for _, v := range regs {
- keyR := false // 关键词匹配结果
- addR := false //附加次匹配结果
- // 1.排除词
- if len(v.excludeField) > 0 && len(v.excludeKeyReg) > 0 {
- // 遍历排除词对应的tmp字段信息
- for _, f := range v.excludeField {
- if val := util.ObjToString(tmp[f]); val != "" {
- if rs, _ := getRegsResult(val, v.excludeKeyReg); rs {
- //有排除词,直接判断下一个规则
- continue Loop
- }
- }
- }
- }
- // 清理词;目的把 类似 fuck的单词替换为空字符串
- //if len(v.clearKey) > 0 && len(v.matchField) > 0 {
- // for _, s := range v.clearKey {
- // for _, f := range v.matchField {
- // if val := util.ObjToString(tmp[f]); val != "" {
- // tmp[f] = strings.ReplaceAll(val, s, "")
- // }
- // }
- // }
- //}
- // 关键词
- if len(v.matchField) > 0 && len(v.matchKeyReg) > 0 {
- for _, f := range v.matchField {
- if val := util.ObjToString(tmp[f]); val != "" {
- if rs, da := getRegsResult(val, v.matchKeyReg); rs {
- keyR = true
- keyWord = da
- //log.Print("key", da)
- break
- }
- }
- }
- }
- // 附加词
- if len(v.addField) > 0 && len(v.addKeyReg) > 0 && keyR {
- for _, f := range v.addField {
- if val := util.ObjToString(tmp[f]); val != "" {
- if rs, da := getRegsResult(val, v.addKeyReg); rs {
- addR = true
- addWord = da
- //log.Println("add", da)
- break
- }
- }
- }
- } else {
- addR = true
- }
- // 满足 关键词和附加词条件
- if keyR && addR {
- // 去重相同标签
- if !IsInStringArray(v.tagName, tags) {
- tags = append(tags, v.tagName)
- }
- }
- }
- return
- }
- // getRegsResult 验证数据是否符合数组正则
- func getRegsResult(data string, regs []*RegexpInfo) (res bool, a string) {
- for _, e1 := range regs {
- if e1.regs != nil && e1.regs.MatchString(data) {
- return true, e1.regs.String()
- } else {
- // && 特殊处理
- if strings.Contains(e1.keyStr, "&&") {
- flag := true
- for _, s := range strings.Split(e1.keyStr, "&&") {
- if !strings.Contains(data, s) {
- flag = false
- break
- }
- }
- if flag {
- return true, e1.keyStr
- }
- }
- // 前面是必须有的关键词&!,后面是不能有的关键词;比如 军队&!点军队,
- if strings.Contains(e1.keyStr, "&!") {
- keys := strings.Split(e1.keyStr, "&!")
- if strings.Contains(data, keys[0]) && !strings.Contains(data, keys[1]) {
- return true, e1.keyStr
- }
- }
- }
- }
- return false, ""
- }
- // IsInStringArray 判断数组中是否存在字符串
- func IsInStringArray(str string, arr []string) bool {
- // 先对字符串数组进行排序
- sort.Strings(arr)
- // 使用二分查找算法查找字符串
- pos := sort.SearchStrings(arr, str)
- // 如果找到了则返回 true,否则返回 false
- return pos < len(arr) && arr[pos] == str
- }
- // getFileText 获取附件内容
- func getFileText(tmp map[string]interface{}) (filetext string) {
- if attchMap, ok := tmp["attach_text"].(map[string]interface{}); attchMap != nil && ok {
- for _, tmpData1 := range attchMap {
- if tmpData2, ok := tmpData1.(map[string]interface{}); tmpData2 != nil && ok {
- for _, result := range tmpData2 {
- if resultMap, ok := result.(map[string]interface{}); resultMap != nil && ok {
- if attach_url := util.ObjToString(resultMap["attach_url"]); attach_url != "" {
- bs := oss.OssGetObject(attach_url, mongodb.BsonIdToSId(tmp["_id"])) //oss读数据
- filetext += bs
- }
- }
- }
- }
- }
- }
- return
- }
|