main.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. package main
  2. import (
  3. util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  4. "jygit.jydev.jianyu360.cn/data_processing/common_utils/elastic"
  5. "jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
  6. "log"
  7. "sort"
  8. "strings"
  9. )
  10. func main() {
  11. //name := "宣威市西泽乡社会保障服务中心"
  12. //rs := ruleBuyer(name)
  13. //log.Println("rs", rs)
  14. log.Println("111111112222")
  15. return
  16. projectTopInformation() //处理项目情报
  17. log.Println("处理完毕")
  18. }
  19. // ruleBuyer 判断采购单位正确,名称错误返回true,名称正确返回false
  20. func ruleBuyer(input string) (res bool) {
  21. //开头的单词
  22. preWords := []string{"转发", "省", "会议室", "某", "某单位", "某公司", "某学校", "测试", "某大学", "某医院", "拟建", "机械", "县", "市", "区", "巡察", "人民路", "对", "楼", "家长", "春季", "对", "度", "初级中学", "州", "总部", "一号", "含", "育场", "选择", "第包", "医院",
  23. "共赢资产", "从", "实验中学", "公共", "乘用车", "部与", "一直", "一体化", "现对", "现为", "之", "份", "半坡", "下属", "程", "信息", "带", "工务", "技术", "于", "号", "辖属", "造", "计财", "实验", "原", "器械", "是", "师", "雨山区", "云城区", "阜涣", "公联", "批",
  24. "总承包", "姓市", "秋季学期", "哈巴河", "保险", "开发区", "尘设资", "团", "物业", "农村", "部", "二", "后勤", "位于", "选定", "依法", "口", "代表", "这", "逝沮省", "上半年", "第一", "门市", "配套", "八月", "七月", "集回", "维修", "遴选", "但", "增加",
  25. "取消", "采购", "一直", "一体化", "现对", "现为", "之", "份", "取消", "转发", "省", "会议室", "某", "某单位", "某公司", "某学校", "测试", "某大学", "某医院", "拟建", "机械", "县", "市", "区", "巡察", "人民", "对", "楼", "家长", "春季", "于", "度", "初级中学", "州", "总部", "一号", "含", "育场", "选择", "第包", "医院",
  26. "共赢资产", "从", "实验中学", "公共", "乘用车", "部与", "一直", "一体化", "现对", "现为", "之", "份", "半坡", "下属", "程", "信息", "带", "工务", "技术", "于", "号", "辖属", "造", "计财", "实验", "原", "器械", "是", "师", "阜涣", "公联", "批",
  27. "总承包", "姓市", "秋季学期", "哈巴河", "保险", "开发区", "尘设资", "团", "物业", "农村", "部", "东省", "于", "章", "董", "分局", "再", "微", "明", "建", "公司", "审计", "满足", "中学", "届", "大学", "按摩", "中心", "附属", "总", "教育局", "中学", "小学", "学院",
  28. "中医院", "人医院", "学校", "输", "十六", "有限", "节能", "二公司", "分公司", "子公司", "公司", "审计", "河河", "地公司", "六公司", "三公司", "十六公司", "节能", "股份", "运输公司", "堇", "家纺", "港区", "检查"}
  29. //开头关键词
  30. for _, word := range preWords {
  31. if strings.HasPrefix(input, word) {
  32. res = true
  33. log.Println(word)
  34. return res
  35. }
  36. }
  37. //结尾关键词
  38. suffixes := []string{"院院", "局局", "场场", "小学室", "和社", "人屡政府", "谈话室", "小区局", "今作社", "点场", "人昆政府",
  39. "年度室", "分行银行", "人政府", "人民矢院", "教学楼局", "笺理局", "地场", "人民唉院", "瞥理局", "所院", "农业衣村局",
  40. "民丢局", "委员会老干部", "办非处", "等支局", "监督站局", "停车库局", "检查员", "办直处", "进行局", "楼局", "等局", "人民政府社",
  41. "模块局", "人民政俯", "人民医标院", "农业农局", "园局", "规则局", "人乓政府", "人事条局", "箐理所", "在政府", "重点局", "大学入场",
  42. "入场", "发也站", "赘源局", "计划生育服务中心政府", "第一人民吹院", "有限公司室", "教标育局", "一民政府", "场部", "埋局", "大学大学",
  43. "分公司分公司", "医院医院", "测试", "公司", "市", "显微镜", "段", "现场局", "租赁"}
  44. for _, word := range suffixes {
  45. if strings.HasSuffix(input, word) {
  46. res = true
  47. log.Println(word)
  48. return res
  49. }
  50. }
  51. //包含的关键词
  52. specials := []string{"丿", "艹", "[ ", "【", "?", "亻", "#", "~", "^", "亻", "*", "$", "、", "/", "*",
  53. "<>", "[ ", "【", "?", "某", "我", "第一轮", "第一次", "第一词", "第一季", "各学校", "第一批", "完全学校",
  54. "一致同意", "X", "保体障局", "人们政府", "上设局", "开发茎", "场场", "设保", "武鳖", "集回", "项日", "代理银行",
  55. "辽宁省省会", "菖处", "口国", "人民汰院", "肉州市", "火车站社", "自然资源和规局", "萎员会", "经济技术开发茎",
  56. "()", "()", "有限公司厂", "测试", "建设建设", "建设规模", "满足", "郑州郑州", "学校学校", "&", ";", ";",
  57. "就医院", "酒医院", "至医院", "对", "所需", "提升", "提高", "学期", "学年", "规模", "必须", "建成", "各公司",
  58. "养护", "拿", "艹", "关于", "要求", "举办", "显示所", "右阴公司", "发射", "加装", "扩建", "道路维修", "等所",
  59. "维稳中心", "异议", "任务", "分包", "其他", "行为", "中标人", "教室", "安置", "暂行", "选聘", "合同", "转发",
  60. "勿救", "既有", "装置", "开展", "依据", "指定", "一般用", "采供", "修缮", "招标单位", "联系方式", "沟通",
  61. "该项目", "安装", "造价", "改造", "样品", "课室", "水毁道路", "闲置资产", "某单位", "某公司", "某学校", "测试", "某大学", "某医院", "地产鲨", "项目组",
  62. "公国司", "物资", "评估与医院", "年室", "招标", "设有", "复限公司", "服务", "罩套", "有阴公", "人队", "报告",
  63. "显微镜", "现场局", "租赁", "镇", "市中心", "勐阿糖厂", "展厅", "等医院", "广场室", "水利顷", "市室", "交界处", "自助银行",
  64. "若源局", "布局", "联合体", "气室", "活动场", "包装公司", "投资", "有限", "等", "设备", "急件", "核实", "测汞仪", "黑名单", "制作类",
  65. "大学大学", "学院学院", "大学场", "学校室", "部队部队", "内部", "部分支公司", "短管", "投标文件", "汇编", "收购"}
  66. for _, v := range specials {
  67. if strings.Contains(input, v) {
  68. res = true
  69. log.Println(v)
  70. return res
  71. }
  72. }
  73. return res
  74. }
  75. // projectTopInformation 处理项目表情报一级分类
  76. func projectTopInformation() {
  77. //firsttime 大于21年12月的数据,依赖ids 中的ID查找标讯ID,
  78. //然后吧 tag_topinformation 去重求和 更新项目的 tag_topinformation 字段
  79. where := map[string]interface{}{
  80. "pici": map[string]interface{}{
  81. "$gte": 1638288000, //2021-12-01
  82. },
  83. }
  84. //测试环境
  85. Es := &elastic.Elastic{
  86. S_esurl: "http://192.168.3.149:9201",
  87. I_size: 5,
  88. Username: "",
  89. Password: "",
  90. }
  91. Es.InitElasticSize()
  92. //Es := &elastic.Elastic{
  93. // //S_esurl: "http://127.0.0.1:19908",
  94. // S_esurl: "http://172.17.4.184:19908",
  95. // I_size: 5,
  96. // Username: "jybid",
  97. // Password: "Top2023_JEB01i@31",
  98. //}
  99. //Es.InitElasticSize()
  100. //MgoB := &mongodb.MongodbSim{
  101. // MongodbAddr: "172.17.189.140:27080",
  102. // //MongodbAddr: "127.0.0.1:27083",
  103. // DbName: "qfw",
  104. // Size: 10,
  105. // UserName: "SJZY_RWbid_ES",
  106. // Password: "SJZY@B4i4D5e6S",
  107. // //Direct: true,
  108. //}
  109. //MgoB.InitPool()
  110. ////85 抽取库
  111. //Mgo := &mongodb.MongodbSim{
  112. // //MongodbAddr: "127.0.0.1:27080",
  113. // MongodbAddr: "172.17.4.85:27080",
  114. // DbName: "qfw",
  115. // Size: 10,
  116. // //Direct: true,
  117. //}
  118. //Mgo.InitPool()
  119. // 测试环境
  120. MgoB := &mongodb.MongodbSim{
  121. MongodbAddr: "192.168.3.206:27002",
  122. Size: 10,
  123. DbName: "qfw_data",
  124. UserName: "root",
  125. Password: "root",
  126. //Direct: true,
  127. }
  128. MgoB.InitPool()
  129. defer util.Catch()
  130. sess := MgoB.GetMgoConn()
  131. defer MgoB.DestoryMongoConn(sess)
  132. count := 0
  133. it := sess.DB("qfw_data").C("projectset").Find(where).Select(nil).Iter()
  134. for tmp := make(map[string]interface{}); it.Next(&tmp); count++ {
  135. if count%5000 == 0 {
  136. log.Println("current:", count, tmp["_id"])
  137. }
  138. if tmp["ids"] == nil {
  139. continue
  140. }
  141. if ids, ok := tmp["ids"].([]interface{}); ok {
  142. var tags = make([]string, 0)
  143. for _, id := range ids {
  144. biddingData, _ := MgoB.FindById("bidding", util.ObjToString(id), nil)
  145. topinformation := (*biddingData)["tag_topinformation"]
  146. if topinformation == nil {
  147. continue
  148. } else {
  149. if tagInfos, ok2 := topinformation.([]interface{}); ok2 {
  150. for _, v := range tagInfos {
  151. if !IsInStringArray(util.ObjToString(v), tags) {
  152. tags = append(tags, util.ObjToString(v))
  153. }
  154. }
  155. }
  156. }
  157. }
  158. if len(tags) > 0 {
  159. oldTags := make([]string, 0)
  160. if tmp["tag_topinformation"] != nil {
  161. if oldtop := tmp["tag_topinformation"].([]interface{}); ok {
  162. for _, v := range oldtop {
  163. oldTags = append(oldTags, util.ObjToString(v))
  164. }
  165. }
  166. }
  167. if SlicesEqual(tags, oldTags) {
  168. continue
  169. }
  170. //pid := mongodb.BsonIdToSId(tmp["_id"])
  171. //update := map[string]interface{}{
  172. // "tag_topinformation": tags,
  173. //}
  174. //MgoB.UpdateById("projectset", pid, map[string]interface{}{"$set": update})
  175. //err := Es.UpdateDocument("projectset", pid, update)
  176. //if err != nil && err.Error() != "Document not updated: noop" {
  177. // log.Println("es update err", err)
  178. //}
  179. }
  180. }
  181. }
  182. }
  183. // IsInStringArray 判断数组中是否存在字符串
  184. func IsInStringArray(str string, arr []string) bool {
  185. // 先对字符串数组进行排序
  186. sort.Strings(arr)
  187. // 使用二分查找算法查找字符串
  188. pos := sort.SearchStrings(arr, str)
  189. // 如果找到了则返回 true,否则返回 false
  190. return pos < len(arr) && arr[pos] == str
  191. }
  192. // SlicesEqual checks if two string slices contain the same elements, regardless of order
  193. func SlicesEqual(slice1, slice2 []string) bool {
  194. // First check if their lengths are the same
  195. if len(slice1) != len(slice2) {
  196. return false
  197. }
  198. // Create a map to count occurrences of each element in slice1
  199. countMap := make(map[string]int)
  200. for _, v := range slice1 {
  201. countMap[v]++
  202. }
  203. // Subtract the count for each element in slice2
  204. for _, v := range slice2 {
  205. countMap[v]--
  206. // If any count goes below zero, the slices are not equal
  207. if countMap[v] < 0 {
  208. return false
  209. }
  210. }
  211. // If all counts are zero, the slices are equal
  212. for _, count := range countMap {
  213. if count != 0 {
  214. return false
  215. }
  216. }
  217. return true
  218. }