123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- package util
- import (
- "fmt"
- . "jy/mongodbutil"
- qu "qfw/util"
- . "gopkg.in/mgo.v2/bson"
- )
- //敏感词
- type DFA struct {
- Link map[string]interface{}
- }
- var syncint chan bool //获取下标锁
- var Config map[string]interface{}
- var Se = qu.SimpleEncrypt{Key: "topnet@extract"}
- var BrandRules map[string]map[string]string
- var GoodsConfig []string
- var BrandConfig []string
- var GoodsGet *DFA //商品
- var BrandGet *DFA //品牌
- var IsBrandGoods bool //是否开启品牌抽取
- func init() {
- syncint = make(chan bool, 1)
- }
- func InitMgoPool() {
- initCap := qu.IntAll(Config["dbsize"])
- addr := qu.ObjToString(Config["mgodb"])
- dbname := qu.ObjToString(Config["dbname"])
- Mgo = MgoFactory(initCap, initCap*3, 120, addr, dbname)
- }
- func GetSyncIndex(code string) string {
- tmp := ""
- syncint <- true
- Mgo.Update("rule_code", `{"code":"`+code+`"}`, M{"$inc": M{"index": 1}}, true, false)
- data, _ := Mgo.FindOne("rule_code", `{"code":"`+code+`"}`)
- <-syncint
- if len(*data) > 0 {
- tmp = code + "_" + fmt.Sprint((*data)["index"])
- }
- return tmp
- }
- //nfields非复制字段集
- func DeepCopy(value interface{}) interface{} {
- if valueMap, ok := value.(map[string]interface{}); ok {
- newMap := make(map[string]interface{})
- for k, v := range valueMap {
- newMap[k] = DeepCopy(v)
- }
- return newMap
- } else if valueSlice, ok := value.([]interface{}); ok {
- newSlice := make([]interface{}, len(valueSlice))
- for k, v := range valueSlice {
- newSlice[k] = DeepCopy(v)
- }
- return newSlice
- }
- return value
- }
- func (d *DFA) AddWord(keys ...string) {
- d.AddWordAll(true, keys...)
- }
- func (d *DFA) AddWordAll(haskey bool, keys ...string) {
- if d.Link == nil {
- d.Link = make(map[string]interface{})
- }
- for _, key := range keys {
- nowMap := &d.Link
- for i := 0; i < len(key); i++ {
- kc := key[i : i+1]
- if v, ok := (*nowMap)[kc]; ok {
- nowMap, _ = v.(*map[string]interface{})
- } else {
- newMap := map[string]interface{}{}
- newMap["YN"] = "0"
- (*nowMap)[kc] = &newMap
- nowMap = &newMap
- }
- if i == len(key)-1 {
- (*nowMap)["YN"] = "1"
- if haskey {
- (*nowMap)["K"] = key
- }
- }
- }
- }
- }
- func (d *DFA) CheckSensitiveWord(src string) string {
- pos := 0
- nowMap := &d.Link
- res := ""
- for i := 0; i < len(src); i++ {
- word := src[i : i+1]
- nowMap, _ = (*nowMap)[word].(*map[string]interface{})
- if nowMap != nil { // 存在,则判断是否为最后一个
- if pos == 0 {
- pos = i
- }
- if "1" == qu.ObjToString((*nowMap)["YN"]) { // 如果为最后一个匹配规则,结束循环,返回匹配标识数
- res = qu.ObjToString((*nowMap)["K"])
- //pos = 0
- //break
- }
- } else {
- if res != "" {
- break
- } else {
- nowMap = &d.Link
- if pos > 0 {
- i = pos
- pos = 0
- }
- }
- }
- }
- return res
- }
- //初始化商品
- func InitGoods() {
- GoodsGet = &DFA{}
- GoodsGet.AddWord(GoodsConfig...)
- }
- //初始化品牌
- func InitBrand() {
- BrandGet = &DFA{}
- BrandGet.AddWord(BrandConfig...)
- }
|