util.go 3.1 KB

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