util.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package util
  2. import (
  3. "fmt"
  4. . "jy/mongodbutil"
  5. qu "qfw/util"
  6. . "gopkg.in/mgo.v2/bson"
  7. )
  8. //敏感词
  9. type DFA struct {
  10. Link map[string]interface{}
  11. }
  12. var syncint chan bool //获取下标锁
  13. var Config map[string]interface{}
  14. var Se = qu.SimpleEncrypt{Key: "topnet@extract"}
  15. var BrandRules map[string]map[string]string
  16. var GoodsConfig []string
  17. var BrandConfig []string
  18. var GoodsGet *DFA //商品
  19. var BrandGet *DFA //品牌
  20. var IsBrandGoods bool //是否开启品牌抽取
  21. func init() {
  22. syncint = make(chan bool, 1)
  23. }
  24. func InitMgoPool() {
  25. initCap := qu.IntAll(Config["dbsize"])
  26. addr := qu.ObjToString(Config["mgodb"])
  27. dbname := qu.ObjToString(Config["dbname"])
  28. Mgo = MgoFactory(initCap, initCap*3, 120, addr, dbname)
  29. }
  30. func GetSyncIndex(code string) string {
  31. tmp := ""
  32. syncint <- true
  33. Mgo.Update("rule_code", `{"code":"`+code+`"}`, M{"$inc": M{"index": 1}}, true, false)
  34. data, _ := Mgo.FindOne("rule_code", `{"code":"`+code+`"}`)
  35. <-syncint
  36. if len(*data) > 0 {
  37. tmp = code + "_" + fmt.Sprint((*data)["index"])
  38. }
  39. return tmp
  40. }
  41. //nfields非复制字段集
  42. func DeepCopy(value interface{}) interface{} {
  43. if valueMap, ok := value.(map[string]interface{}); ok {
  44. newMap := make(map[string]interface{})
  45. for k, v := range valueMap {
  46. newMap[k] = DeepCopy(v)
  47. }
  48. return newMap
  49. } else if valueSlice, ok := value.([]interface{}); ok {
  50. newSlice := make([]interface{}, len(valueSlice))
  51. for k, v := range valueSlice {
  52. newSlice[k] = DeepCopy(v)
  53. }
  54. return newSlice
  55. }
  56. return value
  57. }
  58. func (d *DFA) AddWord(keys ...string) {
  59. d.AddWordAll(true, keys...)
  60. }
  61. func (d *DFA) AddWordAll(haskey bool, keys ...string) {
  62. if d.Link == nil {
  63. d.Link = make(map[string]interface{})
  64. }
  65. for _, key := range keys {
  66. nowMap := &d.Link
  67. for i := 0; i < len(key); i++ {
  68. kc := key[i : i+1]
  69. if v, ok := (*nowMap)[kc]; ok {
  70. nowMap, _ = v.(*map[string]interface{})
  71. } else {
  72. newMap := map[string]interface{}{}
  73. newMap["YN"] = "0"
  74. (*nowMap)[kc] = &newMap
  75. nowMap = &newMap
  76. }
  77. if i == len(key)-1 {
  78. (*nowMap)["YN"] = "1"
  79. if haskey {
  80. (*nowMap)["K"] = key
  81. }
  82. }
  83. }
  84. }
  85. }
  86. func (d *DFA) CheckSensitiveWord(src string) string {
  87. pos := 0
  88. nowMap := &d.Link
  89. res := ""
  90. for i := 0; i < len(src); i++ {
  91. word := src[i : i+1]
  92. nowMap, _ = (*nowMap)[word].(*map[string]interface{})
  93. if nowMap != nil { // 存在,则判断是否为最后一个
  94. if pos == 0 {
  95. pos = i
  96. }
  97. if "1" == qu.ObjToString((*nowMap)["YN"]) { // 如果为最后一个匹配规则,结束循环,返回匹配标识数
  98. res = qu.ObjToString((*nowMap)["K"])
  99. //pos = 0
  100. //break
  101. }
  102. } else {
  103. if res != "" {
  104. break
  105. } else {
  106. nowMap = &d.Link
  107. if pos > 0 {
  108. i = pos
  109. pos = 0
  110. }
  111. }
  112. }
  113. }
  114. return res
  115. }
  116. //初始化商品
  117. func InitGoods() {
  118. GoodsGet = &DFA{}
  119. GoodsGet.AddWord(GoodsConfig...)
  120. }
  121. //初始化品牌
  122. func InitBrand() {
  123. BrandGet = &DFA{}
  124. BrandGet.AddWord(BrandConfig...)
  125. }