12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460 |
- // extractInit
- package extract
- import (
- db "jy/mongodbutil"
- ju "jy/util"
- qu "qfw/util"
- "regexp"
- "sort"
- "strconv"
- "strings"
- "sync"
- "time"
- log "github.com/donnie4w/go-logger/logger"
- )
- type RegLuaInfo struct { //正则或脚本信息
- Code, Name, Field string //
- RuleText string //
- IsLua bool //
- RegPreBac *ExtReg //
- RegCore *ExtReg //
- LFields map[string]string //lua抽取字段属性组
- }
- type ExtReg struct {
- Reg *regexp.Regexp
- Replace string
- Bextract bool
- ExtractPos map[string]int
- NumSign int //正负修正标记,例如浮动率(上浮正1、下浮负-1)
- }
- type RuleCore struct {
- Field string //逻辑字段
- LuaLogic string //进入逻辑
- ExtFrom string //从哪个字段抽取
- RulePres []*RegLuaInfo //抽取前置规则
- RuleBacks []*RegLuaInfo //抽取后置规则
- RuleCores []*RegLuaInfo //抽取规则
- }
- type Tag struct {
- Type string //标签类型 string 字符串、regexp 正则
- Key string //
- Reg *regexp.Regexp //
- }
- type TaskInfo struct {
- Name, Version, VersionId, TrackColl string //名称、版本、版本id、追踪记录表
- FromDbAddr, FromDB, FromColl string //抽取数据库地址、库名、表名
- ToDbAddr, ToDB, ToColl string //结果数据库地址、库名、表名
- TestColl, LastExtId string //测试结果表、上次抽取信息id
- FDB *db.Pool //数据库连接池
- TDB *db.Pool //数据库连接池
- IsEtxLog bool //是否开启抽取日志
- ProcessPool chan bool //任务进程池
- TestLua bool //检查测试用
- }
- type ExtractTask struct {
- Id string //任务id
- IsRun bool //是否启动
- Content string //信息内容
- TaskInfo *TaskInfo //任务信息
- RulePres []*RegLuaInfo //通用前置规则
- RuleBacks []*RegLuaInfo //通用后置规则
- RuleBlock *ju.RuleBlock
- //RuleCores []*RuleCore //抽取规则
- RuleCores map[string]map[string][]*RuleCore //分类抽取规则
- PkgRuleCores []*RuleCore //分包抽取规则
- Tag map[string][]*Tag //标签库
- ClearFn map[string][]string //清理函数
- IsExtractCity bool //是否开启城市抽取
- Fields map[string]int //抽取属性组
- IsFileField bool //是否开启附件抽取
- FileFields *sync.Map //抽取附件属性组
- ResultChanel chan bool //抽取结果详情
- ResultArr [][]map[string]interface{} //抽取结果详情
- BidChanel chan bool //抽取结果
- BidArr [][]map[string]interface{} //抽取结果
- BidTotal int //结果数量
- RecogFieldMap map[string]map[string]interface{} //识别字段
- FidClassMap map[string][]map[string]interface{} //分类
- CidRuleMap map[string][]map[string]interface{} //规则
- AuditFields []string //需要审核的字段名称
- ProvinceMap map[string]string //省全称简称(key:浙江省 val:浙江)
- ProvinceBriefMap map[string]*Province //省简称对应的省信息(key:浙江 val:&Province{})
- CityMap map[string]string //市全称简称(key:杭州市 val:杭州)
- CityBriefMap map[string]*City //市简称对应的市信息(key:杭州 val:&City{})
- CityFullMap map[string]*City //市全称对应的市信息(key:杭州市 val:&City{})
- DistrictCityMap map[string]*City //区或县对应的city
- DistrictSimAndAll map[string]string //区或县(key:简称 val:全称)
- StreetDistrictMap map[string]*District //街道对应的区或县
- ProvinceAllGet *ju.DFA //省全称
- ProvinceSimGet *ju.DFA //省简称
- CityAllGet *ju.DFA //市全称
- CitySimGet *ju.DFA //市简称
- DistrictAllGet *ju.DFA //区或县全称
- DistrictSimGet *ju.DFA //区或县简称
- StreetGet *ju.DFA //街道
- PostCodeMap map[string]*PostCode //邮编
- AreaCodeMap map[string]*AreaCode //区号
- InfoType []map[string]interface{}
- }
- type ClearTaskInfo struct {
- Name, Version, VersionId string //名称、版本、版本id
- FromDbAddr, FromDB, FromColl string //清理数据库地址、库名、表名
- FDB *db.Pool //数据库连接池
- TDB *db.Pool //数据库连接池
- IsCltLog bool //是否开启清理日志
- ProcessPool chan bool //任务进程池
- }
- type ClearLua struct {
- Field string //字段字段
- Code string //代码
- Name string //名称
- LuaText string
- //LuaLogic string //进入逻辑
- //ExtFrom string //从哪个字段抽取
- LFields map[string]string //lua抽取字段属性组
- }
- type ClearTask struct {
- Id string //任务id
- Content string //信息内容
- ClearTaskInfo *ClearTaskInfo //任务信息
- ClearLuas map[string][]*ClearLua //清理脚本
- UpdateResult [][]map[string]interface{} //清理后结果
- ClearChannel chan bool
- }
- func init() {
- TaskList = make(map[string]*ExtractTask)
- ClearTaskList = make(map[string]*ClearTask)
- go SaveExtLog()
- go SaveCltLog() //保存清理日志
- }
- //加载任务信息
- func (e *ExtractTask) InitTestTaskInfo(resultcoll, trackcoll string) {
- task, _ := db.Mgo.FindById("task", e.Id, nil)
- if len(*task) > 1 {
- v, _ := db.Mgo.FindOne("version", `{"version":"`+(*task)["s_version"].(string)+`","delete":false}`)
- e.TaskInfo = &TaskInfo{
- Name: (*task)["s_taskname"].(string),
- Version: (*task)["s_version"].(string),
- VersionId: qu.BsonIdToSId((*v)["_id"]),
- TrackColl: trackcoll,
- FromDbAddr: (*task)["s_mgoaddr"].(string),
- FromDB: (*task)["s_mgodb"].(string),
- FromColl: (*task)["s_mgocoll"].(string),
- TestColl: resultcoll,
- IsEtxLog: true,
- ProcessPool: make(chan bool, 1),
- }
- if (*v)["isextractcity"] != nil {
- e.IsExtractCity = (*v)["isextractcity"].(bool)
- }
- } else {
- return
- }
- }
- //加载任务信息
- func (e *ExtractTask) InitTaskInfo() {
- task, _ := db.Mgo.FindById("task", e.Id, nil)
- log.Debug("task", task)
- if len(*task) > 1 {
- v, _ := db.Mgo.FindOne("version", `{"version":"`+(*task)["s_version"].(string)+`","delete":false}`)
- strs := strings.Split((*task)["s_mgosavecoll"].(string), "/")
- log.Debug("s_mgosavecoll", strs)
- if len(strs) < 3 {
- return
- } else {
- e.TaskInfo = &TaskInfo{
- Name: (*task)["s_taskname"].(string),
- Version: (*task)["s_version"].(string),
- VersionId: qu.BsonIdToSId((*v)["_id"]),
- //TrackColl: (*task)["s_trackcoll"].(string),
- FromDbAddr: (*task)["s_mgoaddr"].(string),
- FromDB: (*task)["s_mgodb"].(string),
- FromColl: (*task)["s_mgocoll"].(string),
- ToDbAddr: strs[0],
- ToDB: strs[1],
- ToColl: strs[2],
- IsEtxLog: false, //qu.If(qu.IntAll((*task)["i_track"]) == 1, true, false).(bool),
- LastExtId: qu.ObjToString((*task)["s_extlastid"]),
- ProcessPool: make(chan bool, qu.IntAllDef((*task)["i_process"], 1)),
- }
- if (*v)["isextractcity"] != nil {
- e.IsExtractCity = (*v)["isextractcity"].(bool)
- }
- }
- log.Debug(e.TaskInfo.Name, "thread:", qu.IntAllDef((*task)["i_process"], 1))
- } else {
- return
- }
- }
- //加载通用前置规则
- func (e *ExtractTask) InitRulePres() {
- defer qu.Catch()
- e.RulePres = []*RegLuaInfo{}
- list, _ := db.Mgo.Find("rule_pre", `{"s_version":"`+e.TaskInfo.Version+`","delete":false}`, nil, nil, false, -1, -1)
- for _, v := range *list {
- rinfo := &RegLuaInfo{
- Code: v["s_code"].(string),
- Name: v["s_name"].(string),
- IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
- }
- if rinfo.IsLua {
- rinfo.RuleText = v["s_luascript"].(string)
- e.RulePres = append(e.RulePres, rinfo)
- } else {
- qu.Try(func() {
- rinfo.RuleText = v["s_rule"].(string)
- tmp := strings.Split(rinfo.RuleText, "__")
- var pattern string
- if strings.Contains(tmp[0], "\\u") {
- tmp[0] = strings.Replace(tmp[0], "\\", "\\\\", -1)
- tmp[0] = strings.Replace(tmp[0], "\\\\u", "\\u", -1)
- pattern, _ = strconv.Unquote(`"` + tmp[0] + `"`)
- } else {
- pattern = tmp[0]
- }
- if len(tmp) == 2 {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: tmp[1]}
- } else {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: ""}
- }
- e.RulePres = append(e.RulePres, rinfo)
- }, func(err interface{}) {
- log.Debug(rinfo.Code, rinfo.Field, err)
- })
- }
- }
- }
- //加载通用后置规则
- func (e *ExtractTask) InitRuleBacks() {
- defer qu.Catch()
- e.RuleBacks = []*RegLuaInfo{}
- list, _ := db.Mgo.Find("rule_back", `{"s_version":"`+e.TaskInfo.Version+`","delete":false}`, nil, nil, false, -1, -1)
- for _, v := range *list {
- rinfo := &RegLuaInfo{
- Code: v["s_code"].(string),
- Name: v["s_name"].(string),
- IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
- }
- if rinfo.IsLua {
- rinfo.RuleText = v["s_luascript"].(string)
- e.RuleBacks = append(e.RuleBacks, rinfo)
- } else {
- qu.Try(func() {
- rinfo.RuleText = v["s_rule"].(string)
- tmp := strings.Split(rinfo.RuleText, "__")
- var pattern string
- if strings.Contains(tmp[0], "\\u") {
- tmp[0] = strings.Replace(tmp[0], "\\", "\\\\", -1)
- tmp[0] = strings.Replace(tmp[0], "\\\\u", "\\u", -1)
- pattern, _ = strconv.Unquote(`"` + tmp[0] + `"`)
- } else {
- pattern = tmp[0]
- }
- if len(tmp) == 2 {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: tmp[1]}
- } else {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: ""}
- }
- e.RuleBacks = append(e.RuleBacks, rinfo)
- }, func(err interface{}) {
- log.Debug(rinfo.Code, rinfo.Field, err)
- })
- }
- }
- }
- func (e *ExtractTask) InfoTypeList() {
- infolist1, _ := db.Mgo.Find("infotype", `{}`, `{}`, `{}`, false, -1, -1)
- infolist := *infolist1
- for _, v := range infolist {
- e.InfoType = append(e.InfoType, v)
- }
- }
- //加载抽取规则
- func (e *ExtractTask) InitRuleCore() {
- defer qu.Catch()
- e.Fields = map[string]int{}
- e.RuleCores = make(map[string]map[string][]*RuleCore)
- fieldrules := map[string][]*RuleCore{}
- vinfos, _ := db.Mgo.Find("versioninfo", `{"vid":"`+e.TaskInfo.VersionId+`","delete":false}`, nil, nil, false, -1, -1)
- for _, vinfo := range *vinfos {
- if b, _ := vinfo["isuse"].(bool); !b {
- continue
- }
- s_field := qu.ObjToString(vinfo["s_field"])
- pid := qu.BsonIdToSId(vinfo["_id"])
- list, _ := db.Mgo.Find("rule_logic", `{"pid":"`+pid+`","delete":false}`, nil, nil, false, -1, -1)
- for _, vv := range *list {
- if b, _ := vv["isuse"].(bool); !b {
- continue
- }
- rcore := &RuleCore{}
- rcore.Field = s_field
- rcore.LuaLogic = qu.ObjToString(vv["s_luascript"]) //是否进入逻辑脚本
- rcore.ExtFrom = qu.If(vv["extfrom"].(bool), "title", "detail").(string)
- //前置规则
- rulePres := []*RegLuaInfo{}
- plist, _ := db.Mgo.Find("rule_logicpre", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`","delete":false}`, nil, nil, false, -1, -1)
- for _, v := range *plist {
- rinfo := &RegLuaInfo{
- Field: qu.ObjToString(v["s_field"]),
- Code: v["s_code"].(string),
- Name: v["s_name"].(string),
- IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
- }
- if rinfo.IsLua {
- rinfo.RuleText = v["s_luascript"].(string)
- rulePres = append(rulePres, rinfo)
- } else {
- qu.Try(func() {
- rinfo.RuleText = v["s_rule"].(string)
- tmp := strings.Split(rinfo.RuleText, "__")
- var pattern string
- if strings.Contains(tmp[0], "\\u") {
- tmp[0] = strings.Replace(tmp[0], "\\", "\\\\", -1)
- tmp[0] = strings.Replace(tmp[0], "\\\\u", "\\u", -1)
- pattern, _ = strconv.Unquote(`"` + tmp[0] + `"`)
- } else {
- pattern = tmp[0]
- }
- if len(tmp) == 2 {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: tmp[1]}
- } else {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: ""}
- }
- rulePres = append(rulePres, rinfo)
- }, func(err interface{}) {
- log.Debug(rinfo.Code, rinfo.Field, err)
- })
- }
- }
- rcore.RulePres = rulePres
- //后置规则
- ruleBacks := []*RegLuaInfo{}
- blist, _ := db.Mgo.Find("rule_logicback", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`","delete":false}`, nil, nil, false, -1, -1)
- for _, v := range *blist {
- rinfo := &RegLuaInfo{
- Field: qu.ObjToString(v["s_field"]),
- Code: v["s_code"].(string),
- Name: v["s_name"].(string),
- IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
- }
- if rinfo.IsLua {
- rinfo.RuleText = v["s_luascript"].(string)
- ruleBacks = append(ruleBacks, rinfo)
- } else {
- qu.Try(func() {
- rinfo.RuleText = v["s_rule"].(string)
- tmp := strings.Split(rinfo.RuleText, "__")
- var pattern string
- if strings.Contains(tmp[0], "\\u") {
- tmp[0] = strings.Replace(tmp[0], "\\", "\\\\", -1)
- tmp[0] = strings.Replace(tmp[0], "\\\\u", "\\u", -1)
- pattern, _ = strconv.Unquote(`"` + tmp[0] + `"`)
- } else {
- pattern = tmp[0]
- }
- if len(tmp) == 2 {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: tmp[1]}
- } else {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: ""}
- }
- ruleBacks = append(ruleBacks, rinfo)
- }, func(err interface{}) {
- log.Debug(rinfo.Code, rinfo.Field, err)
- })
- }
- }
- rcore.RuleBacks = ruleBacks
- //抽取规则
- ruleCores := []*RegLuaInfo{}
- clist, _ := db.Mgo.Find("rule_logicore", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`","delete":false}`, nil, nil, false, -1, -1)
- for _, v := range *clist {
- if b, _ := v["isuse"].(bool); !b {
- continue
- }
- field := qu.ObjToString(v["s_field"])
- e.Fields[field] = 1 //加入抽取属性组备用
- rinfo := &RegLuaInfo{
- Field: field,
- Code: v["s_code"].(string),
- Name: v["s_name"].(string),
- IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
- }
- if rinfo.IsLua {
- rinfo.RuleText = v["s_luascript"].(string)
- //提取全部属性
- rinfo.LFields = getALLFields()
- ruleCores = append(ruleCores, rinfo)
- } else {
- qu.Try(func() {
- rinfo.RuleText = v["s_rule"].(string)
- tmp := strings.Split(rinfo.RuleText, "__")
- var pattern string
- if strings.Contains(tmp[0], "\\u") {
- tmp[0] = strings.Replace(tmp[0], "\\", "\\\\", -1)
- tmp[0] = strings.Replace(tmp[0], "\\\\u", "\\u", -1)
- pattern, _ = strconv.Unquote(`"` + tmp[0] + `"`)
- } else {
- pattern = tmp[0]
- }
- if len(tmp) == 2 {
- epos := strings.Split(tmp[1], ",")
- posm := map[string]int{}
- for _, v := range epos {
- ks := strings.Split(v, ":")
- if len(ks) == 2 { //(.*)招标公告(.*)__2:projectname,4:area
- posm[ks[1]] = qu.IntAll(ks[0])
- } else { //(.*)招标公告__2
- posm[rinfo.Field] = qu.IntAll(ks[0])
- }
- }
- rinfo.RegCore = &ExtReg{Reg: regexp.MustCompile(pattern), Bextract: true, ExtractPos: posm}
- } else {
- rinfo.RegCore = &ExtReg{Reg: regexp.MustCompile(pattern), Bextract: false}
- }
- ruleCores = append(ruleCores, rinfo)
- }, func(err interface{}) {
- log.Debug(rinfo.Code, rinfo.Field, err)
- })
- }
- }
- rcore.RuleCores = ruleCores
- //
- if fieldrules[s_field] == nil {
- fieldrules[s_field] = []*RuleCore{}
- }
- fieldrules[s_field] = append(fieldrules[s_field], rcore)
- }
- }
- //属性配置
- infolist, _ := db.Mgo.Find("infotype", `{}`, `{}`, `{}`, false, -1, -1)
- for _, v := range *infolist {
- topclass := qu.ObjToString(v["topclass"])
- if v["subclass"] == nil {
- e.RuleCores[topclass] = make(map[string][]*RuleCore)
- for attr, _ := range v["fields"].(map[string]interface{}) {
- e.RuleCores[topclass][attr] = fieldrules[attr]
- }
- } else {
- for ca, fs := range v["subclass"].(map[string]interface{}) {
- e.RuleCores[topclass+"_"+ca] = make(map[string][]*RuleCore)
- for field, _ := range fs.(map[string]interface{}) {
- e.RuleCores[topclass+"_"+ca][field] = fieldrules[field]
- }
- }
- }
- }
- }
- //加载抽取规则
- func (e *ExtractTask) InitRuleCore2() {
- defer qu.Catch()
- e.Fields = map[string]int{}
- infolist, _ := db.Mgo.Find("infotype", `{}`, `{}`, `{}`, false, -1, -1)
- e.RuleCores = make(map[string]map[string][]*RuleCore)
- for _, v := range *infolist {
- topclass := qu.ObjToString(v["topclass"])
- if v["subclass"] == nil {
- e.RuleCores[topclass] = make(map[string][]*RuleCore)
- for attr, _ := range v["fields"].(map[string]interface{}) {
- vinfo, _ := db.Mgo.FindOneByField("versioninfo", `{"vid":"`+e.TaskInfo.VersionId+`","delete":false,"s_field":"`+attr+`"}`, `{}`)
- e.RuleCores[topclass][attr] = append(e.RuleCores[topclass][attr], e.InfoRole(*vinfo)...)
- }
- } else {
- for ca, fs := range v["subclass"].(map[string]interface{}) {
- e.RuleCores[topclass+"_"+ca] = make(map[string][]*RuleCore)
- for field, _ := range fs.(map[string]interface{}) {
- vinfo, _ := db.Mgo.FindOneByField("versioninfo", `{"vid":"`+e.TaskInfo.VersionId+`","delete":false,"s_field":"`+field+`"}`, `{}`)
- e.RuleCores[topclass+"_"+ca][field] = append(e.RuleCores[topclass+"_"+ca][field], e.InfoRole(*vinfo)...)
- }
- }
- }
- }
- }
- func (e *ExtractTask) InfoRole(vinfo map[string]interface{}) []*RuleCore {
- maps := []*RuleCore{}
- if b, _ := vinfo["isuse"].(bool); !b {
- return nil
- }
- s_field := qu.ObjToString(vinfo["s_field"])
- pid := qu.BsonIdToSId(vinfo["_id"])
- list, _ := db.Mgo.Find("rule_logic", `{"pid":"`+pid+`","delete":false}`, nil, nil, false, -1, -1)
- for _, vv := range *list {
- if b, _ := vv["isuse"].(bool); !b {
- continue
- }
- rcore := &RuleCore{}
- rcore.Field = s_field
- rcore.LuaLogic = qu.ObjToString(vv["s_luascript"]) //是否进入逻辑脚本
- rcore.ExtFrom = qu.If(vv["extfrom"].(bool), "title", "detail").(string)
- //前置规则
- rulePres := []*RegLuaInfo{}
- plist, _ := db.Mgo.Find("rule_logicpre", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`","delete":false}`, nil, nil, false, -1, -1)
- for _, v := range *plist {
- rinfo := &RegLuaInfo{
- Field: qu.ObjToString(v["s_field"]),
- Code: v["s_code"].(string),
- Name: v["s_name"].(string),
- IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
- }
- if rinfo.IsLua {
- rinfo.RuleText = v["s_luascript"].(string)
- rulePres = append(rulePres, rinfo)
- } else {
- qu.Try(func() {
- rinfo.RuleText = v["s_rule"].(string)
- tmp := strings.Split(rinfo.RuleText, "__")
- var pattern string
- if strings.Contains(tmp[0], "\\u") {
- tmp[0] = strings.Replace(tmp[0], "\\", "\\\\", -1)
- tmp[0] = strings.Replace(tmp[0], "\\\\u", "\\u", -1)
- pattern, _ = strconv.Unquote(`"` + tmp[0] + `"`)
- } else {
- pattern = tmp[0]
- }
- if len(tmp) == 2 {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: tmp[1]}
- } else {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: ""}
- }
- rulePres = append(rulePres, rinfo)
- }, func(err interface{}) {
- log.Debug(rinfo.Code, rinfo.Field, err)
- })
- }
- }
- rcore.RulePres = rulePres
- //后置规则
- ruleBacks := []*RegLuaInfo{}
- blist, _ := db.Mgo.Find("rule_logicback", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`","delete":false}`, nil, nil, false, -1, -1)
- for _, v := range *blist {
- rinfo := &RegLuaInfo{
- Field: qu.ObjToString(v["s_field"]),
- Code: v["s_code"].(string),
- Name: v["s_name"].(string),
- IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
- }
- if rinfo.IsLua {
- rinfo.RuleText = v["s_luascript"].(string)
- ruleBacks = append(ruleBacks, rinfo)
- } else {
- qu.Try(func() {
- rinfo.RuleText = v["s_rule"].(string)
- tmp := strings.Split(rinfo.RuleText, "__")
- var pattern string
- if strings.Contains(tmp[0], "\\u") {
- tmp[0] = strings.Replace(tmp[0], "\\", "\\\\", -1)
- tmp[0] = strings.Replace(tmp[0], "\\\\u", "\\u", -1)
- pattern, _ = strconv.Unquote(`"` + tmp[0] + `"`)
- } else {
- pattern = tmp[0]
- }
- if len(tmp) == 2 {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: tmp[1]}
- } else {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: ""}
- }
- ruleBacks = append(ruleBacks, rinfo)
- }, func(err interface{}) {
- log.Debug(rinfo.Code, rinfo.Field, err)
- })
- }
- }
- rcore.RuleBacks = ruleBacks
- //抽取规则
- ruleCores := []*RegLuaInfo{}
- clist, _ := db.Mgo.Find("rule_logicore", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`","delete":false}`, nil, nil, false, -1, -1)
- for _, v := range *clist {
- if b, _ := v["isuse"].(bool); !b {
- continue
- }
- field := qu.ObjToString(v["s_field"])
- e.Fields[field] = 1 //加入抽取属性组备用
- rinfo := &RegLuaInfo{
- Field: field,
- Code: v["s_code"].(string),
- Name: v["s_name"].(string),
- IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
- }
- if rinfo.IsLua {
- rinfo.RuleText = v["s_luascript"].(string)
- //提取全部属性
- rinfo.LFields = getALLFields()
- ruleCores = append(ruleCores, rinfo)
- } else {
- qu.Try(func() {
- rinfo.RuleText = v["s_rule"].(string)
- ptmp := strings.Split(rinfo.RuleText, "#")
- sign := 0
- if len(ptmp) == 2 {
- if ptmp[1] == "正" {
- sign = 1
- } else if ptmp[1] == "负" {
- sign = -1
- }
- }
- tmp := strings.Split(ptmp[0], "__")
- var pattern string
- if strings.Contains(tmp[0], "\\u") {
- tmp[0] = strings.Replace(tmp[0], "\\", "\\\\", -1)
- tmp[0] = strings.Replace(tmp[0], "\\\\u", "\\u", -1)
- pattern, _ = strconv.Unquote(`"` + tmp[0] + `"`)
- } else {
- pattern = tmp[0]
- }
- if len(tmp) == 2 {
- epos := strings.Split(tmp[1], ",")
- posm := map[string]int{}
- for _, v := range epos {
- ks := strings.Split(v, ":")
- if len(ks) == 2 { //(.*)招标公告(.*)__2:projectname,4:area
- posm[ks[1]] = qu.IntAll(ks[0])
- } else { //(.*)招标公告__2
- posm[rinfo.Field] = qu.IntAll(ks[0])
- }
- }
- rinfo.RegCore = &ExtReg{Reg: regexp.MustCompile(pattern), Bextract: true, ExtractPos: posm, NumSign: sign}
- } else {
- rinfo.RegCore = &ExtReg{Reg: regexp.MustCompile(pattern), Bextract: false}
- }
- ruleCores = append(ruleCores, rinfo)
- }, func(err interface{}) {
- log.Debug(rinfo.Code, rinfo.Field, err)
- })
- }
- }
- rcore.RuleCores = ruleCores
- //
- maps = append(maps, rcore)
- }
- return maps
- }
- //加载分包抽取规则
- func (e *ExtractTask) InitPkgCore() {
- defer qu.Catch()
- e.PkgRuleCores = []*RuleCore{}
- pkginfos, _ := db.Mgo.Find("pkg_info", `{"vid":"`+e.TaskInfo.VersionId+`","delete":false}`, nil, nil, false, -1, -1)
- for _, pkginfo := range *pkginfos {
- if b, _ := pkginfo["isuse"].(bool); !b {
- continue
- }
- s_field := qu.ObjToString(pkginfo["s_field"])
- pid := qu.BsonIdToSId(pkginfo["_id"])
- logicList, _ := db.Mgo.Find("pkg_logic", `{"pid":"`+pid+`","delete":false}`, nil, nil, false, -1, -1)
- for _, vv := range *logicList {
- if b, _ := vv["isuse"].(bool); !b {
- continue
- }
- rcore := &RuleCore{}
- rcore.Field = s_field
- rcore.LuaLogic = qu.ObjToString(vv["s_luascript"]) //是否进入逻辑脚本
- rcore.ExtFrom = qu.If(vv["extfrom"].(bool), "title", "detail").(string)
- //后置规则
- ruleBacks := []*RegLuaInfo{}
- blist, _ := db.Mgo.Find("pkg_logicback", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`","delete":false}`, nil, nil, false, -1, -1)
- for _, v := range *blist {
- rinfo := &RegLuaInfo{
- Field: qu.ObjToString(v["s_field"]),
- Code: v["s_code"].(string),
- Name: v["s_name"].(string),
- IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
- }
- if rinfo.IsLua {
- rinfo.RuleText = v["s_luascript"].(string)
- ruleBacks = append(ruleBacks, rinfo)
- } else {
- qu.Try(func() {
- rinfo.RuleText = v["s_rule"].(string)
- tmp := strings.Split(rinfo.RuleText, "__")
- var pattern string
- if strings.Contains(tmp[0], "\\u") {
- tmp[0] = strings.Replace(tmp[0], "\\", "\\\\", -1)
- tmp[0] = strings.Replace(tmp[0], "\\\\u", "\\u", -1)
- pattern, _ = strconv.Unquote(`"` + tmp[0] + `"`)
- } else {
- pattern = tmp[0]
- }
- if len(tmp) == 2 {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: tmp[1]}
- } else {
- rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(pattern), Replace: ""}
- }
- ruleBacks = append(ruleBacks, rinfo)
- }, func(err interface{}) {
- log.Debug(rinfo.Code, rinfo.Field, err)
- })
- }
- }
- rcore.RuleBacks = ruleBacks
- e.PkgRuleCores = append(e.PkgRuleCores, rcore)
- }
- }
- }
- //加载标签库
- func (e *ExtractTask) InitTag() {
- defer qu.Catch()
- e.Tag = map[string][]*Tag{}
- //字符串标签库
- list, _ := db.Mgo.Find("tagdetailinfo", `{"s_type":"string","s_version":"`+e.TaskInfo.Version+`","delete":false}`, nil, nil, false, -1, -1)
- for _, v := range *list {
- field := qu.ObjToString(v["s_field"])
- if tmp, ok := v["content"].([]interface{}); ok {
- fname := qu.ObjToString(v["s_name"])
- tab := ju.TagFile{Name: fname} //用于表格kv
- tab.Items = make([]*ju.Tag, len(tmp))
- for k, key := range tmp {
- tag := &Tag{Type: "string", Key: key.(string)}
- e.Tag[field] = append(e.Tag[field], tag)
- tab.Items[k] = &ju.Tag{key.(string), 0 - k, nil}
- }
- sort.Sort(tab.Items)
- ju.TagdbTable[fname] = &tab
- }
- }
- //正则标签库
- list, _ = db.Mgo.Find("tagdetailinfo", `{"s_type":"reg","s_version":"`+e.TaskInfo.Version+`","delete":false}`, nil, nil, false, -1, -1)
- for _, v := range *list {
- field := qu.ObjToString(v["s_field"])
- if tmp, ok := v["content"].([]interface{}); ok {
- fname := qu.ObjToString(v["s_name"])
- tab := ju.TagFile{Name: fname, Type: "reg"} //用于表格kv
- tab.Items = make([]*ju.Tag, len(tmp))
- for k, key := range tmp {
- tag := &Tag{Type: "regexp", Key: key.(string), Reg: regexp.MustCompile(key.(string))}
- e.Tag[field] = append(e.Tag[field], tag)
- tab.Items[k] = &ju.Tag{key.(string), 0 - k, regexp.MustCompile(key.(string))}
- }
- sort.Sort(tab.Items)
- ju.TagdbTable[fname+"_reg"] = &tab
- }
- }
- }
- //获取fields
- func getALLFields() map[string]string {
- fields := map[string]string{}
- list, _ := db.Mgo.Find("fields", `{}`, nil, `{"s_field":1,"s_name"}`, false, -1, -1)
- for _, v := range *list {
- fields[qu.ObjToString(v["s_name"])] = qu.ObjToString(v["s_field"])
- }
- return fields
- }
- //加载clear函数
- func (e *ExtractTask) InitClearFn() {
- defer qu.Catch()
- list, _ := db.Mgo.Find("cleanup", `{"s_version":"`+e.TaskInfo.Version+`","delete":false}`, nil, nil, false, -1, -1)
- fn := map[string][]string{}
- for _, tmp := range *list {
- field := tmp["s_field"].(string)
- fns := tmp["clear"].([]interface{})
- if fn[field] == nil {
- fn[field] = []string{}
- }
- for _, v := range fns {
- fn[field] = append(fn[field], v.(string))
- }
- }
- e.ClearFn = fn
- }
- //加载省份
- func InitProvince(version string) map[string]interface{} {
- defer qu.Catch()
- fn := map[string]interface{}{}
- list, _ := db.Mgo.Find("tagdetailinfo", `{"s_type":"province","s_version":"`+version+`","delete":false}`, nil, nil, false, -1, -1)
- for _, v := range *list {
- name := qu.ObjToString(v["s_name"])
- content := v["content"]
- switch content.(type) {
- case string:
- fn[name] = []interface{}{content.(string)}
- case []interface{}:
- fn[name] = content
- }
- }
- return fn
- }
- //加载城市简称
- func InitCitySim(version string) map[string]map[string]interface{} {
- defer qu.Catch()
- list, _ := db.Mgo.Find("tagdetailinfo", `{"s_type":"citysim","s_version":"`+version+`","delete":false}`, nil, nil, false, -1, -1)
- fn := map[string]map[string]interface{}{}
- for _, v := range *list {
- name := qu.ObjToString(v["s_name"])
- tmp := v["content"].(map[string]interface{})
- fn[name] = tmp
- }
- return fn
- }
- //加载城市全称
- func InitCityAll(version string) map[string]map[string]interface{} {
- defer qu.Catch()
- list, _ := db.Mgo.Find("tagdetailinfo", `{"s_type":"cityall","s_version":"`+version+`","delete":false}`, nil, nil, false, -1, -1)
- fn := map[string]map[string]interface{}{}
- for _, v := range *list {
- name := qu.ObjToString(v["s_name"])
- tmp := v["content"].(map[string]interface{})
- fn[name] = tmp
- }
- return fn
- }
- //初始化城市省份敏感词
- func (e *ExtractTask) InitCityDFA() {
- defer qu.Catch()
- e.CityAllGet = &ju.DFA{}
- e.CitySimGet = &ju.DFA{}
- e.DistrictAllGet = &ju.DFA{}
- e.DistrictSimGet = &ju.DFA{}
- e.ProvinceAllGet = &ju.DFA{}
- e.ProvinceSimGet = &ju.DFA{}
- e.StreetGet = &ju.DFA{}
- //初始化map
- if e.ProvinceMap == nil {
- e.ProvinceMap = make(map[string]string)
- }
- if e.CityMap == nil {
- e.CityMap = make(map[string]string)
- }
- if e.DistrictSimAndAll == nil {
- e.DistrictSimAndAll = make(map[string]string)
- }
- if e.CityBriefMap == nil {
- e.CityBriefMap = make(map[string]*City)
- }
- if e.CityFullMap == nil {
- e.CityFullMap = make(map[string]*City)
- }
- if e.ProvinceBriefMap == nil {
- e.ProvinceBriefMap = make(map[string]*Province)
- }
- if e.DistrictCityMap == nil {
- e.DistrictCityMap = make(map[string]*City)
- }
- if e.StreetDistrictMap == nil {
- e.StreetDistrictMap = make(map[string]*District)
- }
- //初始化省
- fn1 := InitProvince(e.TaskInfo.Version)
- for k, v := range fn1 {
- for _, p := range v.([]interface{}) {
- p1, _ := p.(string)
- e.ProvinceAllGet.AddWord(p1) //华中科技大学
- e.ProvinceMap[p1] = k //华中科技大学:湖北
- }
- }
- //初始化城市全称
- fn2 := InitCityAll(e.TaskInfo.Version)
- for k, v := range fn2 {
- //加载省信息
- e.ProvinceAllGet.AddWord(k) //加入省全称dfa(k:浙江省)
- p := &Province{}
- p.Name = k //省全称:浙江省
- p.Brief = v["brief"].(string) //省简称:浙江
- e.ProvinceSimGet.AddWord(p.Brief) //加入省简称dfa(k:浙江)
- e.ProvinceMap[k] = p.Brief //浙江省:浙江
- e.ProvinceBriefMap[p.Brief] = p //浙江:省信息{}
- p.Cap = v["captial"].(string) //省会(杭州)
- //加载市信息
- city, _ := v["city"].(map[string]interface{})
- for k1, v1 := range city {
- e.CityAllGet.AddWord(k1) //加入市全称dfa(k:杭州市)
- v1m, _ := v1.(map[string]interface{})
- c := &City{}
- c.Name = k1 //市全称:杭州市
- c.Brief = v1m["brief"].(string) //市简称:杭州
- e.CitySimGet.AddWord(c.Brief) //加入市简称dfa(k:杭州)
- e.CityMap[k1] = c.Brief //杭州市:杭州
- e.CityBriefMap[c.Brief] = c //杭州:市信息{}
- e.CityFullMap[k1] = c //杭州市:市信息{}
- c.P = p
- if c.Name == p.Cap {
- p.Captial = c //加载province中的省会市信息{}
- }
- //区县
- districtmap := v1m["area"].(map[string]interface{}) //区或县
- for district, streetarr := range districtmap {
- d := &District{}
- d.Name = district
- d.C = c
- //省直辖市,河南济源市没有区一级,目前区一级写的还是济源市
- //匹配时,如果匹配到区,拿区和市比对,相同则代表是省直辖市,不要区一级?
- e.DistrictAllGet.AddWord(district) //加入区或县全称dfa
- ctmp := e.DistrictCityMap[district]
- if ctmp == nil {
- e.DistrictCityMap[district] = c
- }
- //街道
- for _, s := range qu.ObjArrToStringArr(streetarr.([]interface{})) {
- e.StreetGet.AddWord(s) //加入街道敏感词
- dtmp := e.StreetDistrictMap[s]
- if dtmp == nil {
- e.StreetDistrictMap[s] = d
- }
- }
- }
- }
- }
- //初始化城市简称
- fn3 := InitCitySim(e.TaskInfo.Version)
- for _, v := range fn3 {
- city, _ := v["city"].(map[string]interface{})
- for _, v1 := range city {
- v1m, _ := v1.(map[string]interface{})
- cb := v1m["brief"].(string) //市简称
- arr := v1m["area"].(map[string]interface{}) //区或县简称
- for districtsim, districtall := range arr {
- e.DistrictSimAndAll[districtsim] = districtall.(string)
- d := &District{}
- d.Name = districtsim
- d.C = e.CityBriefMap[cb]
- e.DistrictSimGet.AddWord(districtsim) //加入区或县简称敏感词
- ctmp := e.DistrictCityMap[districtsim]
- if ctmp == nil {
- e.DistrictCityMap[districtsim] = e.CityBriefMap[cb]
- }
- }
- }
- }
- }
- //初始化邮编库
- func (e *ExtractTask) InitPostCode() {
- defer qu.Catch()
- if e.PostCodeMap == nil {
- e.PostCodeMap = make(map[string]*PostCode)
- }
- list, _ := db.Mgo.Find("postcode", nil, nil, nil, false, -1, -1)
- for _, l := range *list {
- pc := &PostCode{}
- pc.Code = qu.ObjToString(l["code"])
- pc.P = qu.ObjToString(l["province"])
- pc.C = qu.ObjToString(l["city"])
- pc.D = qu.ObjArrToStringArr(l["district"].([]interface{}))
- e.PostCodeMap[pc.Code] = pc
- }
- }
- //初始化区号库
- func (e *ExtractTask) InitAreaCode() {
- defer qu.Catch()
- if e.AreaCodeMap == nil {
- e.AreaCodeMap = make(map[string]*AreaCode)
- }
- list, _ := db.Mgo.Find("areacode", nil, nil, nil, false, -1, -1)
- for _, l := range *list {
- ac := &AreaCode{}
- ac.Code = qu.ObjToString(l["code"])
- ac.P = qu.ObjToString(l["province"])
- ac.C = qu.ObjArrToStringArr(l["city"].([]interface{}))
- e.AreaCodeMap[ac.Code] = ac
- }
- }
- //初始化城市省份敏感词
- //func (e *ExtractTask) InitCityDFA() {
- // defer qu.Catch()
- // e.CityAllGet = &ju.DFA{}
- // e.DistrictGet = &ju.DFA{}
- // e.AreaProvinceGet = &ju.DFA{}
- // e.StreetGet = &ju.DFA{}
- // //初始化map
- // if e.ProvinceMap == nil {
- // e.ProvinceMap = make(map[string]string)
- // }
- // if e.CityBriefMap == nil {
- // e.CityBriefMap = make(map[string]*City)
- // }
- // if e.ProvinceBriefMap == nil {
- // e.ProvinceBriefMap = make(map[string]*Province)
- // }
- // if e.AreaToCityMap == nil {
- // e.AreaToCityMap = make(map[string][]*City)
- // }
- // if e.DistrictCityMap == nil {
- // e.DistrictCityMap = make(map[string]*City)
- // }
- // if e.StreetDistrictMap == nil {
- // e.StreetDistrictMap = make(map[string]*District)
- // }
- // //初始化省
- // fn1 := InitProvince(e.TaskInfo.Version)
- // for k, v := range fn1 {
- // for _, p := range v.([]interface{}) {
- // p1, _ := p.(string)
- // e.AreaProvinceGet.AddWord(p1) //华中科技大学
- // e.ProvinceMap[p1] = k //华中科技大学:湖北
- // }
- // }
- // //初始化城市全称
- // fn2 := InitCityAll(e.TaskInfo.Version)
- // for k, v := range fn2 {
- // e.AreaProvinceGet.AddWord(k) //加入省全称dfa(k:浙江省)
- // p := &Province{}
- // p.Name = k //省全称
- // p.Brief = v["brief"].(string) //省简称
- // e.ProvinceMap[k] = p.Brief //浙江省:浙江
- // e.ProvinceBriefMap[p.Brief] = p //浙江:省信息
- // p.Cap = v["captial"].(string) //省会(杭州)
- // city, _ := v["city"].(map[string]interface{})
- // //
- // for k1, v1 := range city {
- // v1m, _ := v1.(map[string]interface{})
- // c := &City{}
- // c.Name = k1
- // c.Brief = v1m["brief"].(string)
- // e.CityBriefMap[c.Brief] = c
- // c.P = p
- // if c.Brief == p.Cap {
- // p.Captial = c
- // }
- // //加入到城市map中
- // //
- // cs := e.AreaToCityMap[k1]
- // e.CityAllGet.AddWord(k1) //市全称
- // if cs != nil {
- // cs = append(cs, c)
- // } else {
- // cs = []*City{c}
- // }
- // e.AreaToCityMap[k1] = cs
- // //区县
- // districtmap := v1m["area"].(map[string]interface{}) //区或县
- // for district, streetarr := range districtmap {
- // d := &District{}
- // d.Name = district
- // d.C = c
- // e.DistrictGet.AddWord(district) //加入区或县敏感词
- // ctmp := e.DistrictCityMap[district]
- // if ctmp == nil {
- // e.DistrictCityMap[district] = c
- // }
- // //街道
- // for _, s := range qu.ObjArrToStringArr(streetarr.([]interface{})) {
- // e.StreetGet.AddWord(s) //加入街道敏感词
- // dtmp := e.StreetDistrictMap[s]
- // if dtmp == nil {
- // e.StreetDistrictMap[s] = d
- // }
- // }
- // }
- // }
- // }
- // //初始化城市简称
- // fn3 := InitCitySim(e.TaskInfo.Version)
- // e.CitySimGet = &ju.DFA{}
- // for k, v := range fn3 {
- // pb := v["brief"].(string)
- // p := e.ProvinceBriefMap[pb]
- // //加载
- // for _, ss := range []string{k, pb} { //省全称和省简称
- // cs := e.AreaToCityMap[ss]
- // if cs != nil {
- // cs = append(cs, p.Captial)
- // } else {
- // cs = []*City{p.Captial}
- // }
- // e.AreaToCityMap[ss] = cs
- // e.CitySimGet.AddWord(ss)
- // }
- // city, _ := v["city"].(map[string]interface{})
- // for k1, v1 := range city {
- // v1m, _ := v1.(map[string]interface{})
- // if v1m["brief"] == nil {
- // }
- // cb := v1m["brief"].(string)
- // c := e.AreaToCityMap[k1][0]
- // //加入到城市map中
- // for _, ss := range []string{cb, k + cb, pb + cb} { //杭州 浙江省杭州 浙江杭州
- // e.CitySimGet.AddWord(ss)
- // cs := e.AreaToCityMap[ss]
- // if cs != nil {
- // cs = append(cs, c)
- // } else {
- // cs = []*City{c}
- // }
- // e.AreaToCityMap[ss] = cs
- // }
- // arr := v1m["area"].([]interface{})
- // for _, k2 := range arr {
- // s := k2.(string)
- // for n, ss := range []string{s, cb + s, pb + s, k + s} { //淳安 杭州淳安 浙江淳安 浙江省淳安
- // cs := e.AreaToCityMap[ss]
- // e.CitySimGet.AddWord(ss)
- // if cs != nil {
- // cs = append(cs, c)
- // } else {
- // cs = []*City{c}
- // }
- // e.AreaToCityMap[ss] = cs
- // //只加入简称
- // if n == 0 {
- // d := &District{}
- // d.Name = ss
- // d.C = c
- // e.DistrictGet.AddWord(ss) //加入区或县简称敏感词
- // ctmp := e.DistrictCityMap[ss]
- // if ctmp == nil {
- // e.DistrictCityMap[ss] = c
- // }
- // }
- // }
- // }
- // }
- // }
- //}
- //保存抽取详情数据
- func (e *ExtractTask) ResultSave(init bool) {
- defer qu.Catch()
- if e.ResultArr == nil {
- e.ResultArr = [][]map[string]interface{}{}
- }
- if init {
- go func() {
- for {
- if len(e.ResultArr) > 500 {
- arr := e.ResultArr[:500]
- e.ResultArr = e.ResultArr[500:]
- qu.Try(func() {
- db.Mgo.UpSertBulk("extract_result", arr...)
- }, func(err interface{}) {
- log.Debug(err)
- })
- } else {
- arr := e.ResultArr
- e.ResultArr = [][]map[string]interface{}{}
- qu.Try(func() {
- db.Mgo.UpSertBulk("extract_result", arr...)
- }, func(err interface{}) {
- log.Debug(err)
- })
- }
- time.Sleep(10 * time.Second)
- }
- }()
- } else {
- arr := e.ResultArr
- e.ResultArr = [][]map[string]interface{}{}
- qu.Try(func() {
- e.TaskInfo.TDB.UpSertBulk(e.TaskInfo.ToColl, arr...)
- }, func(err interface{}) {
- log.Debug(err)
- })
- }
- }
- //保存抽取数据
- func (e *ExtractTask) BidSave(init bool) {
- defer qu.Catch()
- if e.BidArr == nil {
- e.BidArr = [][]map[string]interface{}{}
- }
- if init {
- go func() {
- for {
- if len(e.BidArr) > 500 {
- arr := e.BidArr[:500]
- e.BidArr = e.BidArr[500:]
- qu.Try(func() {
- e.TaskInfo.TDB.UpSertBulk(e.TaskInfo.ToColl, arr...)
- }, func(err interface{}) {
- log.Debug(err)
- })
- } else {
- arr := e.BidArr
- e.BidArr = [][]map[string]interface{}{}
- qu.Try(func() {
- e.TaskInfo.TDB.UpSertBulk(e.TaskInfo.ToColl, arr...)
- }, func(err interface{}) {
- log.Debug(err)
- })
- }
- time.Sleep(10 * time.Second)
- }
- }()
- } else {
- arr := e.BidArr
- e.BidArr = [][]map[string]interface{}{}
- qu.Try(func() {
- e.TaskInfo.TDB.UpSertBulk(e.TaskInfo.ToColl, arr...)
- }, func(err interface{}) {
- log.Debug(err)
- })
- time.Sleep(1 * time.Second)
- }
- }
- func (e *ExtractTask) InitAuditRecogField() {
- defer qu.Catch()
- e.RecogFieldMap = make(map[string]map[string]interface{})
- recogFieldList, _ := db.Mgo.Find("rc_field", `{"delete":false}`, `{"_id":1}`, `{"s_recogfield":1,"s_recogfield_prerule":1}`, false, -1, -1)
- for _, f := range *recogFieldList {
- field := qu.ObjToString(f["s_recogfield"])
- e.RecogFieldMap[field] = f
- }
- }
- func (e *ExtractTask) InitAuditClass() {
- defer qu.Catch()
- e.FidClassMap = make(map[string][]map[string]interface{})
- class, _ := db.Mgo.Find("rc_class", `{"delete":false}`, `{"i_order":1}`, nil, false, -1, -1)
- for _, c := range *class {
- classList := []map[string]interface{}{}
- fid := qu.ObjToString(c["s_fid"])
- if len(e.FidClassMap[fid]) > 0 { //追加
- classList = e.FidClassMap[fid]
- }
- classList = append(classList, c)
- e.FidClassMap[fid] = classList
- }
- }
- //加载规则
- func (e *ExtractTask) InitAuditRule() {
- defer qu.Catch()
- var rureg *regexp.Regexp
- var rs []rune
- var ru string
- var err error
- e.CidRuleMap = make(map[string][]map[string]interface{})
- rule, _ := db.Mgo.Find("rc_rule", `{"delete":false}`, `{"i_order":1}`, nil, false, -1, -1)
- for _, v := range *rule {
- i_rule := []interface{}{}
- ss, _ := (v["s_rule"].([]interface{}))
- for _, r := range qu.ObjArrToStringArr(ss) {
- if strings.HasPrefix(r, "'") && strings.HasSuffix(r, "'") { //正则
- rs = []rune(r)
- ru = string(rs[1 : len(rs)-1])
- rureg, err = regexp.Compile(ru)
- if err != nil {
- log.Debug("error---rule:", r)
- continue
- }
- i_rule = append(i_rule, []interface{}{rureg}...)
- } else { //规则
- i_rule = append(i_rule, r)
- }
- }
- v["rule"] = i_rule
- ruleList := []map[string]interface{}{}
- classid := qu.ObjToString(v["s_classid"])
- if len(e.CidRuleMap[classid]) > 0 { //追加
- ruleList = e.CidRuleMap[classid]
- }
- ruleList = append(ruleList, v)
- e.CidRuleMap[classid] = ruleList
- }
- }
- //
- func (e *ExtractTask) InitAuditFields() {
- if len(e.AuditFields) == 0 {
- v, _ := db.Mgo.FindOne("version", `{"isuse":true,"delete":false}`) //查找当前使用版本
- if v != nil && len(*v) > 0 { //查找当前使用版本中属性配置需要审核的字段
- vid := qu.BsonIdToSId((*v)["_id"])
- query := map[string]interface{}{
- "isaudit": true,
- "delete": false,
- "vid": vid,
- }
- data, _ := db.Mgo.Find("versioninfo", query, `{"_id":-1}`, `{"s_field":1}`, false, -1, -1)
- for _, d := range *data {
- field := qu.ObjToString(d["s_field"])
- e.AuditFields = append(e.AuditFields, field)
- }
- }
- }
- }
- //加载附件抽取
- func (e *ExtractTask) InitFile() {
- defer qu.Catch()
- //query:=bson.M{"version":e.TaskInfo.Version,"delete":false}
- ve, _ := db.Mgo.FindOne("version", `{"version":"`+e.TaskInfo.Version+`","delete":false}`)
- //ve, _ := db.Mgo.FindOne("version", query)
- if ve == nil {
- return
- }
- if (*ve)["isfiles"] != nil && (*ve)["isfiles"].(bool) {
- e.IsFileField = true
- }
- syscefiled := new(sync.Map)
- if (*ve)["s_filefileds"] != nil {
- for _, vff := range (*ve)["s_filefileds"].([]interface{}) {
- syscefiled.Store(vff.(string), 1)
- }
- }
- e.FileFields = syscefiled
- }
- //加载清理任务信息
- func (c *ClearTask) InitClearTaskInfo() {
- cleartask, _ := db.Mgo.FindById("cleartask", c.Id, nil)
- if len(*cleartask) > 1 {
- v, _ := db.Mgo.FindOne("clearversion", `{"clearversion":"`+(*cleartask)["s_version"].(string)+`","delete":false}`)
- c.ClearTaskInfo = &ClearTaskInfo{
- Name: (*cleartask)["s_taskname"].(string),
- Version: (*cleartask)["s_version"].(string),
- VersionId: qu.BsonIdToSId((*v)["_id"]),
- FromDbAddr: (*cleartask)["s_mgoaddr"].(string),
- FromDB: (*cleartask)["s_mgodb"].(string),
- FromColl: (*cleartask)["s_mgocoll"].(string),
- IsCltLog: ju.Config["iscltlog"].(bool),
- ProcessPool: make(chan bool, qu.IntAllDef((*cleartask)["i_process"], 1)),
- }
- log.Debug(c.ClearTaskInfo.Name, "thread:", qu.IntAllDef((*cleartask)["i_process"], 1))
- } else {
- return
- }
- }
- //加载清理脚本
- func (c *ClearTask) InitClearLuas() {
- defer qu.Catch()
- c.ClearLuas = make(map[string][]*ClearLua)
- list, _ := db.Mgo.Find("clearversioninfo", `{"vid":"`+c.ClearTaskInfo.VersionId+`","delete":false}`, nil, nil, false, -1, -1)
- for _, l := range *list {
- if b, _ := l["isuse"].(bool); !b { //仅使用启用的属性
- continue
- }
- s_field := qu.ObjToString(l["s_field"])
- pid := qu.BsonIdToSId(l["_id"])
- luas, _ := db.Mgo.Find("clearulelogic", `{"pid":"`+pid+`","delete":false}`, nil, nil, false, -1, -1)
- for _, vv := range *luas {
- if b, _ := vv["isuse"].(bool); !b {
- continue
- }
- clearLua := &ClearLua{
- Field: s_field,
- Code: vv["s_code"].(string),
- Name: vv["s_name"].(string),
- LuaText: vv["s_luascript"].(string),
- LFields: getALLFields(),
- }
- c.ClearLuas[s_field] = append(c.ClearLuas[s_field], clearLua)
- }
- }
- }
- //加载分块规则
- func (e *ExtractTask) InitBlockRule() {
- datas, _ := db.Mgo.Find("block_info", map[string]interface{}{
- "vid": e.TaskInfo.VersionId,
- "delete": false,
- }, `{"index":-1}`, `{"block_reg":1,"title_reg":1}`, false, -1, -1)
- brs, trs := []*regexp.Regexp{}, []*regexp.Regexp{}
- for _, v := range *datas {
- block_reg, _ := v["block_reg"].(string)
- block_reg, _ = strconv.Unquote(`"` + block_reg + `"`)
- title_reg, _ := v["title_reg"].(string)
- title_reg, _ = strconv.Unquote(`"` + title_reg + `"`)
- if block_reg == "" || title_reg == "" {
- continue
- }
- b_reg, b_err := regexp.Compile(block_reg)
- t_reg, t_err := regexp.Compile(title_reg)
- if b_err != nil || t_err != nil {
- continue
- }
- brs = append(brs, b_reg)
- trs = append(trs, t_reg)
- }
- e.RuleBlock = &ju.RuleBlock{
- BlockRegs: brs,
- TitleRegs: trs,
- Classify: e.InitBlockClassify(),
- }
- }
- //加载分块规则
- func (e *ExtractTask) InitBlockClassify() *ju.BlockClassify {
- classify, _ := db.Mgo.Find("block_classify", map[string]interface{}{
- "vid": e.TaskInfo.VersionId,
- "delete": false,
- }, nil, `{"name":1}`, false, -1, -1)
- classify_info, _ := db.Mgo.Find("block_classify_info", map[string]interface{}{
- "vid": e.TaskInfo.VersionId,
- "delete": false,
- }, nil, `{"name":1,"code":1,"pid":1}`, false, -1, -1)
- classify_tag, _ := db.Mgo.Find("block_classify_tag", map[string]interface{}{
- "vid": e.TaskInfo.VersionId,
- "delete": false,
- }, nil, `{"name":1,"pid":1}`, false, -1, -1)
- tag_map := map[string]ju.Tags{}
- for _, v := range *classify_tag {
- pid := qu.ObjToString(v["pid"])
- tag_map[pid] = append(tag_map[pid], &ju.Tag{Value: qu.ObjToString(v["name"])})
- }
- //
- info_map := map[string][]*ju.NameCode{}
- info_tag := map[string]*ju.TagFile{}
- for _, v := range *classify_info {
- pid := qu.ObjToString(v["pid"])
- _id := qu.BsonIdToSId(v["_id"])
- name := qu.ObjToString(v["name"])
- info_tag[name] = &ju.TagFile{
- Name: name,
- Items: tag_map[_id],
- }
- info_map[pid] = append(info_map[pid], &ju.NameCode{
- Name: name,
- Code: qu.ObjToString(v["code"]),
- })
- }
- classify_map := map[string][]*ju.NameCode{}
- for _, v := range *classify {
- _id := qu.BsonIdToSId(v["_id"])
- if info_map[_id] == nil {
- continue
- }
- for _, vv := range strings.Split(qu.ObjToString(v["name"]), ",") {
- classify_map[vv] = append(classify_map[vv], info_map[_id]...)
- }
- }
- return &ju.BlockClassify{
- Type: classify_map,
- Classify: info_tag,
- }
- }
|