Pārlūkot izejas kodu

Merge branch 'dev3.2' of http://192.168.3.207:10080/qmx/jy-data-extract into dev3.2

maxiaoshan 6 gadi atpakaļ
vecāks
revīzija
6471d05aec

+ 2 - 6
src/jy/admin/rulecheck.go

@@ -347,9 +347,7 @@ func checkBackScript(table, code, name, version, infoid, script string, alone bo
 					tmp = extract.ExtRegPre(tmp, j, v, e.TaskInfo)
 				}
 				//抽取-规则
-				for _, v := range vc.RuleCores {
-					extract.ExtRegCore(vc.ExtFrom, tmp, j, v, e)
-				}
+				extract.ExtRuleCore(tmp, e, vc, j)
 			}
 		}
 	} else {
@@ -365,9 +363,7 @@ func checkBackScript(table, code, name, version, infoid, script string, alone bo
 					tmp = extract.ExtRegPre(tmp, j, v, e.TaskInfo)
 				}
 				//抽取-规则
-				for _, v := range vc.RuleCores {
-					extract.ExtRegCore(vc.ExtFrom, tmp, j, v, e)
-				}
+				extract.ExtRuleCore(tmp, e, vc, j)
 			}
 		}
 	}

+ 98 - 86
src/jy/extract/extract.go

@@ -382,41 +382,37 @@ func (e *ExtractTask) ExtractDetail(j *ju.Job) {
 				// log.Debug("抽取-前置规则", tmp)
 
 				//抽取-规则
-				for _, v := range vc.RuleCores {
-					ExtRegCore(vc.ExtFrom, tmp, j, v, e)
-				}
+				ExtRuleCore(tmp, e, vc, j)
 				// log.Debug("抽取-规则", tmp)
 
+				//抽取-后置规则
+				for _, v := range vc.RuleBacks {
+					ExtRegBack(j, v, e.TaskInfo)
+				}
+				// log.Debug("抽取-后置规则", tmp)
+
 				//项目名称未能抽取到,标题来凑
 				if vc.Field == "projectname" && vc.ExtFrom == "title" {
-					//if len(j.Result[vc.Field]) < 1 {//如果抽取有结果,不走标题。待验证,暂时标题加入选举逻辑
-					field := &ju.ExtField{Field: vc.Field, Code: vc.Id + "_title", RuleText: "title", Type: "title", MatchType: "title", ExtFrom: vc.ExtFrom, SourceValue: j.Title, Value: j.Title}
-					if tmp["blocktag"] != nil {
-						btag := make(map[string]string)
-						for k := range tmp["blocktag"].(map[string]bool) {
-							blocktag.Lock()
-							btag[k] = TagConfigDesc[k]
-							blocktag.Unlock()
+					isextitle := true
+					for _, v := range j.Result[vc.Field] {
+						if len([]rune(qu.ObjToString(v.Value))) > 5 {
+							isextitle = false
+							break
 						}
-						field.BlockTag = btag
 					}
-					j.Result[vc.Field] = append(j.Result[vc.Field], field)
-					//}
-				}
-
-				//抽取-后置规则
-				for i := 0; i < 3; i++ {
-					for _, v := range vc.RuleBacks {
-						ExtRegBack(j, v, e.TaskInfo)
+					if isextitle { //标题加入选举
+						field := &ju.ExtField{Field: vc.Field, Code: vc.Id + "_title", RuleText: "title", Type: "title", MatchType: "title", ExtFrom: vc.ExtFrom, SourceValue: j.Title, Value: j.Title}
+						j.Result[vc.Field] = append(j.Result[vc.Field], field)
+					}
+					for i := 0; i < 3; i++ {
+						for _, v := range vc.RuleBacks {
+							ExtRegBack(j, v, e.TaskInfo)
+						}
 					}
 				}
-				// log.Debug("抽取-后置规则", tmp)
 			}
 		}
 
-		//for _, vvc := range j.Result["budget"] {
-		//log.Debug("-----", fmt.Sprintf("%+v", vvc))
-		//}
 		//全局后置规则
 		for _, v := range e.RuleBacks {
 			ExtRegBack(j, v, e.TaskInfo)
@@ -516,10 +512,8 @@ func (e *ExtractTask) ExtractFile(j *ju.Job) {
 				// log.Debug("抽取-前置规则", tmp)
 
 				//抽取-规则
-				for _, v := range vc.RuleCores {
-					if value, ok := e.FileFields.Load(v.Field); ok && qu.IntAllDef(value, 1) > 0 {
-						ExtRegCore(vc.ExtFrom, tmp, j, v, e)
-					}
+				if value, ok := e.FileFields.Load(vc.Field); ok && qu.IntAllDef(value, 1) > 0 {
+					ExtRuleCore(tmp, e, vc, j)
 				}
 				// log.Debug("抽取-规则", tmp)
 
@@ -622,32 +616,24 @@ func ExtRegPre(doc map[string]interface{}, j *ju.Job, in *RegLuaInfo, t *TaskInf
 }
 
 //抽取-规则
-func ExtRegCore(extfrom string, doc map[string]interface{}, j *ju.Job, in *RegLuaInfo, et *ExtractTask) {
-	defer qu.Catch()
-	//根据field配置项目,是否抽取。例如:废标、流标等跳过,
-	b := IsExtract(in.Field, j.Title, j.Content)
-	if !b {
-		return
+func ExtRuleCore(doc map[string]interface{}, e *ExtractTask, vc *RuleCore, j *ju.Job) {
+	var kvMap map[string][]map[string]interface{}
+	if vc.ExtFrom != "title" {
+		kvMap = getKvByLuaFields(vc, j, e)
 	}
-	kvMap := map[string][]map[string]interface{}{}
-	if extfrom != "title" {
-		kvMap = getKvByLuaFields(extfrom, j, in, et.Tag)
-		if in.IsLua {
-			lua := ju.LuaScript{Code: in.Code, Name: in.Name, Doc: doc, Script: in.RuleText}
-			lua.KvMap = kvMap
-			lua.Block = j.Block
-			extinfo := lua.RunScript("core")
-			if tmps, ok := extinfo[in.Field].([]map[string]interface{}); ok {
-				kvMap[in.Field] = tmps
-			}
+	for _, v := range vc.RuleCores {
+		if v.IsLua {
+			ExtRuleCoreByKv(vc.ExtFrom, doc, j, v, kvMap)
+		} else {
+			ExtRuleCoreByReg(vc.ExtFrom, doc, j, v, e)
 		}
 	}
-	if len(kvMap) > 0 {
-		if j.Result[in.Field] == nil {
-			j.Result[in.Field] = [](*ju.ExtField){}
+	for k, v := range kvMap {
+		if j.Result[k] == nil {
+			j.Result[k] = [](*ju.ExtField){}
 		}
-		for _, tmp := range kvMap[in.Field] {
-			field := &ju.ExtField{Weight: qu.IntAll(tmp["weight"]), Field: in.Field, Code: qu.ObjToString(tmp["code"]), Type: qu.ObjToString(tmp["type"]), MatchType: qu.ObjToString(tmp["matchtype"]), RuleText: qu.ObjToString(tmp["ruletext"]), SourceValue: tmp["sourcevalue"], Value: tmp["value"]}
+		for _, tmp := range v {
+			field := &ju.ExtField{Weight: qu.IntAll(tmp["weight"]), Field: k, Code: qu.ObjToString(tmp["code"]), Type: qu.ObjToString(tmp["type"]), MatchType: qu.ObjToString(tmp["matchtype"]), RuleText: qu.ObjToString(tmp["ruletext"]), SourceValue: tmp["sourcevalue"], Value: tmp["value"]}
 			if tmp["blocktag"] != nil {
 				btag := make(map[string]string)
 				for k := range tmp["blocktag"].(map[string]bool) {
@@ -659,45 +645,71 @@ func ExtRegCore(extfrom string, doc map[string]interface{}, j *ju.Job, in *RegLu
 				}
 				field.BlockTag = btag
 			}
-			j.Result[in.Field] = append(j.Result[in.Field], field)
+			j.Result[k] = append(j.Result[k], field)
 		}
-		AddExtLog("extract", j.SourceMid, nil, kvMap, in, et.TaskInfo) //抽取日志
-	} else if !in.IsLua {
-		//全文正则
-		//text := qu.ObjToString(doc[extfrom])
-		//if in.Field != "" {
-		//	extinfo := extRegCoreToResult(extfrom, text, j, in)
-		//	if len(extinfo) > 0 {
-		//		AddExtLog("extract", j.SourceMid, nil, extinfo, in, et.TaskInfo) //抽取日志
-		//	}
-		//}
-		//块抽取
-		if in.Field != "" {
-			if extfrom == "title" {
-				extinfo := extRegCoreToResult(extfrom, qu.ObjToString(doc[extfrom]), &map[string]string{}, j, in)
+	}
+}
+
+//抽取-规则-kv
+func ExtRuleCoreByKv(extfrom string, doc map[string]interface{}, j *ju.Job, in *RegLuaInfo, kvMap map[string][]map[string]interface{}) {
+	defer qu.Catch()
+	if extfrom == "title" || !in.IsLua {
+		return
+	}
+	lua := ju.LuaScript{Code: in.Code, Name: in.Name, Doc: doc, Script: in.RuleText}
+	lua.KvMap = kvMap
+	lua.Block = j.Block
+	extinfo := lua.RunScript("core")
+	if tmps, ok := extinfo[in.Field].([]map[string]interface{}); ok {
+		for _, v := range tmps {
+			v["core"] = in.Code
+		}
+		kvMap[in.Field] = tmps
+	}
+}
+
+//抽取-规则-正则
+func ExtRuleCoreByReg(extfrom string, doc map[string]interface{}, j *ju.Job, in *RegLuaInfo, et *ExtractTask) {
+	defer qu.Catch()
+	//根据field配置项目,是否抽取。例如:废标、流标等跳过,
+	b := IsExtract(in.Field, j.Title, j.Content)
+	if !b {
+		return
+	}
+	//全文正则
+	//text := qu.ObjToString(doc[extfrom])
+	//if in.Field != "" {
+	//	extinfo := extRegCoreToResult(extfrom, text, j, in)
+	//	if len(extinfo) > 0 {
+	//		AddExtLog("extract", j.SourceMid, nil, extinfo, in, et.TaskInfo) //抽取日志
+	//	}
+	//}
+	//块抽取
+	if in.Field != "" {
+		if extfrom == "title" {
+			extinfo := extRegCoreToResult(extfrom, qu.ObjToString(doc[extfrom]), &map[string]string{}, j, in)
+			if len(extinfo) > 0 {
+				AddExtLog("extract", j.SourceMid, nil, extinfo, in, et.TaskInfo) //抽取日志
+			}
+		} else {
+			for _, v := range j.Block {
+				btag := make(map[string]string)
+				for k := range v.Classify {
+					blocktag.Lock()
+					btag[k] = TagConfigDesc[k]
+					blocktag.Unlock()
+				}
+				extinfo := extRegCoreToResult(extfrom, v.Text, &btag, j, in)
 				if len(extinfo) > 0 {
 					AddExtLog("extract", j.SourceMid, nil, extinfo, in, et.TaskInfo) //抽取日志
 				}
-			} else {
-				for _, v := range j.Block {
-					btag := make(map[string]string)
-					for k := range v.Classify {
-						blocktag.Lock()
-						btag[k] = TagConfigDesc[k]
-						blocktag.Unlock()
-					}
-					extinfo := extRegCoreToResult(extfrom, v.Text, &btag, j, in)
-					if len(extinfo) > 0 {
-						AddExtLog("extract", j.SourceMid, nil, extinfo, in, et.TaskInfo) //抽取日志
-					}
-				}
 			}
 		}
 	}
 }
 
 //lua脚本根据属性设置提取kv值
-func getKvByLuaFields(extfrom string, j *ju.Job, in *RegLuaInfo, t map[string][]*Tag) map[string][]map[string]interface{} {
+func getKvByLuaFields(vc *RuleCore, j *ju.Job, et *ExtractTask) map[string][]map[string]interface{} {
 	kvmap := map[string][]map[string]interface{}{}
 	blocks := []*ju.Block{}
 	for _, bl := range j.Block {
@@ -707,8 +719,8 @@ func getKvByLuaFields(extfrom string, j *ju.Job, in *RegLuaInfo, t map[string][]
 			blocks = append(blocks, bl)
 		}
 	}
-	for fieldname, field := range in.LFields {
-		if field != in.Field {
+	for fieldname, field := range vc.LFields {
+		if field != vc.Field {
 			continue
 		}
 		for _, bl := range blocks {
@@ -729,9 +741,8 @@ func getKvByLuaFields(extfrom string, j *ju.Job, in *RegLuaInfo, t map[string][]
 					if text != "" {
 						kvmap[field] = append(kvmap[field], map[string]interface{}{
 							"field":       field,
-							"code":        in.Code,
 							"ruletext":    vv.Key,
-							"extfrom":     extfrom,
+							"extfrom":     vc.ExtFrom,
 							"sourcevalue": text,
 							"value":       text,
 							"type":        tp,
@@ -744,6 +755,7 @@ func getKvByLuaFields(extfrom string, j *ju.Job, in *RegLuaInfo, t map[string][]
 			}
 		}
 	}
+	AddExtLog("extract", j.SourceMid, nil, kvmap, &RegLuaInfo{Field: vc.Field}, et.TaskInfo) //抽取日志
 	return kvmap
 }
 
@@ -773,7 +785,7 @@ func extRegCoreToResult(extfrom, text string, tag *map[string]string, j *ju.Job,
 						"field":     v.Field,
 						"code":      v.Code,
 						"ruletext":  v.RuleText,
-						"extfrom":   extfrom,
+						"extfrom":   text,
 						"value":     val,
 						"type":      "regexp",
 						"matchtype": "regcontent",
@@ -810,7 +822,7 @@ func extRegCoreToResult(extfrom, text string, tag *map[string]string, j *ju.Job,
 								"field":     v.Field,
 								"code":      v.Code,
 								"ruletext":  regArr[0],
-								"extfrom":   extfrom,
+								"extfrom":   text,
 								"value":     value,
 								"type":      "regexp",
 								"matchtype": "regcontent",
@@ -846,7 +858,7 @@ func extRegCoreToResult(extfrom, text string, tag *map[string]string, j *ju.Job,
 				"field":     v.Field,
 				"code":      v.Code,
 				"ruletext":  v.RuleText,
-				"extfrom":   extfrom,
+				"extfrom":   text,
 				"value":     val,
 				"type":      "regexp",
 				"matchtype": "regcontent",

+ 15 - 14
src/jy/extract/extractInit.go

@@ -16,12 +16,11 @@ import (
 )
 
 type RegLuaInfo struct { //正则或脚本信息
-	Code, Name, Field string            //
-	RuleText          string            //
-	IsLua             bool              //
-	RegPreBac         *ExtReg           //
-	RegCore           *ExtReg           //
-	LFields           map[string]string //lua抽取字段属性组
+	Code, Name, Field string  //
+	RuleText          string  //
+	IsLua             bool    //
+	RegPreBac         *ExtReg //
+	RegCore           *ExtReg //
 }
 type ExtReg struct {
 	Reg        *regexp.Regexp
@@ -31,13 +30,14 @@ type ExtReg struct {
 	NumSign    int //正负修正标记,例如浮动率(上浮正1、下浮负-1)
 }
 type RuleCore struct {
-	Id        string        //id
-	Field     string        //逻辑字段
-	LuaLogic  string        //进入逻辑
-	ExtFrom   string        //从哪个字段抽取
-	RulePres  []*RegLuaInfo //抽取前置规则
-	RuleBacks []*RegLuaInfo //抽取后置规则
-	RuleCores []*RegLuaInfo //抽取规则
+	Id        string            //id
+	Field     string            //逻辑字段
+	LuaLogic  string            //进入逻辑
+	ExtFrom   string            //从哪个字段抽取
+	RulePres  []*RegLuaInfo     //抽取前置规则
+	RuleBacks []*RegLuaInfo     //抽取后置规则
+	RuleCores []*RegLuaInfo     //抽取规则
+	LFields   map[string]string //所有字段属性组
 }
 
 type Tag struct {
@@ -293,6 +293,7 @@ func (e *ExtractTask) InfoTypeList() {
 //加载抽取规则
 func (e *ExtractTask) InitRuleCore() {
 	defer qu.Catch()
+	allFields := getALLFields()
 	e.Fields = map[string]int{}
 	e.RuleCores = make(map[string]map[string][]*RuleCore)
 
@@ -313,6 +314,7 @@ func (e *ExtractTask) InitRuleCore() {
 			rcore.Field = s_field
 			rcore.LuaLogic = qu.ObjToString(vv["s_luascript"]) //是否进入逻辑脚本
 			rcore.ExtFrom = qu.If(vv["extfrom"].(bool), "title", "detail").(string)
+			rcore.LFields = allFields
 			//前置规则
 			rulePres := []*RegLuaInfo{}
 			plist, _ := db.Mgo.Find("rule_logicpre", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`","delete":false}`, nil, nil, false, -1, -1)
@@ -404,7 +406,6 @@ func (e *ExtractTask) InitRuleCore() {
 					Name:  v["s_name"].(string),
 					IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
 				}
-				rinfo.LFields = getALLFields()
 				if rinfo.IsLua {
 					rinfo.RuleText = v["s_luascript"].(string)
 					//提取全部属性

+ 1 - 1
src/jy/pretreated/analykv.go

@@ -334,7 +334,7 @@ func FindKv(con, tag string, from int) (m *SortMap) {
 }
 
 func keydetail(k, v string, m *SortMap, tag string, pos int, strs [][]string, matchMap map[string]map[string]bool, from int) {
-	if regexp.MustCompile("^[0-9]+[、]+$").MatchString(v){
+	if regexp.MustCompile("^[0-9]+[、]+$").MatchString(v) {
 		return
 	}
 	k = space.ReplaceAllString(k, "")

+ 8 - 1
src/jy/pretreated/analystep.go

@@ -57,6 +57,7 @@ func AnalyStart(job *util.Job) {
 			newCon = TextAfterRemoveTable(con)
 			job.BlockPackage = FindPackageFromText(job.Title, newCon)
 			for i := 0; i < len(tabs); i++ {
+				//log.Println(tabs[i].Text())
 				//添加标识:文本中有table
 				tabres := AnalyTableV2(tabs[i], job.Category, "", con, 1, job.SourceMid, job.RuleBlock) //解析表格入口 返回:汇总表格对象
 				processTableResult(tabres, bl, job)
@@ -103,8 +104,14 @@ func FindProjectCode(newCon string, job *util.Job) {
 		return
 	}
 	var proCode string
-	proCode = projectcodeReg.FindString(newCon)
 	blCode := &util.Block{}
+	if projectcodeRegAll.MatchString(newCon){//项目名称项目编号一起的5d424bdfa5cb26b9b7ac7a85
+		splitStr := strings.Split(newCon, " ")
+		if len(splitStr) >=2{
+			newCon = "项目编号:"+splitStr[len(splitStr)-1]
+		}
+	}
+	proCode = projectcodeReg.FindString(newCon)
 	if proCode != "" {
 		ckv := GetKVAll(proCode, job.Title, nil, 1)
 		blCode.ColonKV = ckv

+ 2 - 1
src/jy/pretreated/analytable.go

@@ -107,8 +107,9 @@ var (
 	underline                   = regexp.MustCompile("_+$")
 	iswinnertabletag            = regexp.MustCompile("(中标|候选人|成交|结果)")
 	nswinnertabletag            = regexp.MustCompile("[评得分估]+")
+	projectcodeRegAll           = regexp.MustCompile(`采购项目名称及项目编号[:|:]?`)
 	projectcodeReg              = regexp.MustCompile(`((|\(|\[){1}(编号|项目编号|标段编号|招标编号){1}(:|:)(.){4,30}()|\)|\])`)
-	projectcodeReg2             = regexp.MustCompile(`((?:^|\n)编号|项目编号|标段编号){1}(:|:)(.){4,30}[0-9a-zA-Z号]`)
+	projectcodeReg2             = regexp.MustCompile(`((?:^|\n)编号|项目编号|标段编号){1}(:|:)(.){4,30}[0-9a-zA-Z号]`)
 	projectcodeReg3             = regexp.MustCompile("(^询价单编号[A-Za-z0-9/-]*|公告编号[A-Za-z0-9/-]*)")
 	jsonReg                     = regexp.MustCompile(`\{.+:[^}]*\} `) //  \{".*\":\".+\"}
 	regHz                       = regexp.MustCompile("[\u4e00-\u9fa5]")

+ 1 - 1
src/jy/pretreated/colonkv.go

@@ -795,7 +795,7 @@ func GetKvTags(findkvs []*Kv, title string, tagdbs []string) map[string][]*Tag {
 			}
 		} else {
 			if val != "" {
-				kvTags[key] = append(kvTags[key], &Tag{Key: k, Value: val, IsInvalid: true})
+				kvTags[k] = append(kvTags[k], &Tag{Key: k, Value: val, IsInvalid: true})
 			}
 		}
 	}

+ 2 - 0
src/jy/pretreated/division.go

@@ -246,6 +246,8 @@ func DivideBlock(tp, content string, from int, ruleBlock *util.RuleBlock) ([]*ut
 				titles = append(titles, sv)
 			}
 		}
+		block.Title = title
+		block.Titles = titles
 		block.Classify, block.NotClassifyTitles = ruleBlock.Classify.GetClassify(tp, titles)
 		tagsToBlocks(blocks, block)
 		//log.Println(index, sv, splitTitles)

+ 67 - 68
src/jy/pretreated/tablev2.go

@@ -218,84 +218,83 @@ func (td *TD) tdHasTable(bsontable *bool, tr *TR) {
 				}
 				stag = str
 			}
-			for _, tv := range tabs {
-				if IsHide(tv) {
-					continue
-				}
-				sonts := NewTableResult(ts.Id, ts.Toptype, stag, td.Html, 2, td.TR.Table.TableResult.RuleBlock)
-				sonts.GoqueryTabs = tv
-				sonts.Analy()
-
-				//sonts := AnalyTableV2(tabs, ts.Toptype, stag, td.Html, 2, ts.Id, table.TableResult.RuleBlock) //又一次调用解析表格入口
-				td.BH = false
-				if td.TR.Table.TableResult == nil {
-					td.TR.Table.TableResult = NewTableResult(sonts.Id, sonts.Toptype, sonts.BlockTag, sonts.Html, sonts.Itype, sonts.RuleBlock)
-				}
-				MergeKvTags(td.TR.Table.TableResult.KvTags, sonts.KvTags)
-				td.SonTableResult = sonts
-				//for _, k := range sonts.SortKV.Keys {
-				//u.Debug(k, sonts.SortKV.Map[k])
-				//				td.TR.Table.StandKV[k] = sonts.SortKV.Map[k].(string)
-				//				td.TR.Table.StandKVWeight[k] = sonts.SortKVWeight[k]
-				//}
-				//增加brand (子表)
-				//fmt.Println("sonsHasKey=============", sonts.HasKey)
-				//fmt.Println("sonsHasGoods========", sonts.HasGoods)
-				//fmt.Println("sonsHasBrand========", sonts.HasBrand)
-				if sonts.HasKey != 0 {
-					td.TR.Table.TableResult.HasKey = sonts.HasKey
-				}
-				if sonts.HasGoods != 0 {
-					td.TR.Table.TableResult.HasGoods = sonts.HasGoods
-				}
-				if sonts.HasBrand != 0 {
-					td.TR.Table.TableResult.HasBrand = sonts.HasBrand
-				}
-				if sonts.BrandData != nil && len(sonts.BrandData) > 0 { //子table
-					for _, v := range sonts.BrandData {
-						if len(v) > 0 {
-							td.TR.Table.TableResult.BrandData = append(td.TR.Table.TableResult.BrandData, v)
-						}
+		}
+		for _, tv := range tabs {
+			if IsHide(tv) {
+				continue
+			}
+			sonts := NewTableResult(ts.Id, ts.Toptype, stag, td.Html, 2, td.TR.Table.TableResult.RuleBlock)
+			sonts.GoqueryTabs = tv
+			sonts.Analy()
+
+			//sonts := AnalyTableV2(tabs, ts.Toptype, stag, td.Html, 2, ts.Id, table.TableResult.RuleBlock) //又一次调用解析表格入口
+			td.BH = false
+			if td.TR.Table.TableResult == nil {
+				td.TR.Table.TableResult = NewTableResult(sonts.Id, sonts.Toptype, sonts.BlockTag, sonts.Html, sonts.Itype, sonts.RuleBlock)
+			}
+			MergeKvTags(td.TR.Table.TableResult.KvTags, sonts.KvTags)
+			td.SonTableResult = sonts
+			//for _, k := range sonts.SortKV.Keys {
+			//u.Debug(k, sonts.SortKV.Map[k])
+			//				td.TR.Table.StandKV[k] = sonts.SortKV.Map[k].(string)
+			//				td.TR.Table.StandKVWeight[k] = sonts.SortKVWeight[k]
+			//}
+			//增加brand (子表)
+			//fmt.Println("sonsHasKey=============", sonts.HasKey)
+			//fmt.Println("sonsHasGoods========", sonts.HasGoods)
+			//fmt.Println("sonsHasBrand========", sonts.HasBrand)
+			if sonts.HasKey != 0 {
+				td.TR.Table.TableResult.HasKey = sonts.HasKey
+			}
+			if sonts.HasGoods != 0 {
+				td.TR.Table.TableResult.HasGoods = sonts.HasGoods
+			}
+			if sonts.HasBrand != 0 {
+				td.TR.Table.TableResult.HasBrand = sonts.HasBrand
+			}
+			if sonts.BrandData != nil && len(sonts.BrandData) > 0 { //子table
+				for _, v := range sonts.BrandData {
+					if len(v) > 0 {
+						td.TR.Table.TableResult.BrandData = append(td.TR.Table.TableResult.BrandData, v)
 					}
 				}
-				if sonts.WinnerOrder != nil && len(sonts.WinnerOrder) > 0 {
-					td.TR.Table.TableResult.WinnerOrder = sonts.WinnerOrder
-				}
-				if sonts.IsMultiPackage {
-					td.TR.Table.BPackage = true
-					tb1 := td.TR.Table.BlockPackage
-					for k, v := range sonts.PackageMap.Map {
-						v1 := v.(*u.BlockPackage)
-						if tb1.Map[k] == nil {
-							tb1.AddKey(k, v)
-						} else {
-							bp := tb1.Map[k].(*u.BlockPackage)
-							if bp != nil && v1.TableKV != nil {
-								for k2, v2 := range v1.TableKV.KvTags {
-									if bp.TableKV == nil {
-										bp.TableKV = u.NewJobKv()
-									}
-									isExists := false
-									for _, v2v := range v2 {
-										for _, v2vv := range bp.TableKV.KvTags[k2] {
-											if v2v.Value == v2vv.Value {
-												isExists = true
-												break
-											}
-										}
-										if !isExists {
-											bp.TableKV.KvTags[k2] = append(bp.TableKV.KvTags[k2], v2v)
-											bp.Text += fmt.Sprintf("%v:%v\n", k2, v2)
+			}
+			if sonts.WinnerOrder != nil && len(sonts.WinnerOrder) > 0 {
+				td.TR.Table.TableResult.WinnerOrder = sonts.WinnerOrder
+			}
+			if sonts.IsMultiPackage {
+				td.TR.Table.BPackage = true
+				tb1 := td.TR.Table.BlockPackage
+				for k, v := range sonts.PackageMap.Map {
+					v1 := v.(*u.BlockPackage)
+					if tb1.Map[k] == nil {
+						tb1.AddKey(k, v)
+					} else {
+						bp := tb1.Map[k].(*u.BlockPackage)
+						if bp != nil && v1.TableKV != nil {
+							for k2, v2 := range v1.TableKV.KvTags {
+								if bp.TableKV == nil {
+									bp.TableKV = u.NewJobKv()
+								}
+								isExists := false
+								for _, v2v := range v2 {
+									for _, v2vv := range bp.TableKV.KvTags[k2] {
+										if v2v.Value == v2vv.Value {
+											isExists = true
+											break
 										}
 									}
+									if !isExists {
+										bp.TableKV.KvTags[k2] = append(bp.TableKV.KvTags[k2], v2v)
+										bp.Text += fmt.Sprintf("%v:%v\n", k2, v2)
+									}
 								}
 							}
 						}
 					}
-					//u.Debug(fmt.Sprintf("%v", td.TR.Table.BlockPackage.Map["1"]))
 				}
+				//u.Debug(fmt.Sprintf("%v", td.TR.Table.BlockPackage.Map["1"]))
 			}
-
 		}
 	}
 }

+ 10 - 5
src/res/fieldscore.json

@@ -122,14 +122,14 @@
         "positivewords": [
             {
                 "describe": "以*结尾",
-                "regstr": ".{2,100}(委员会|办公室|幼儿园|动物园|图书馆|殡仪馆|博物馆|基地|青年宫|少年宫|艺术宫|电视台|中心|协会|公司|政府|初中|集团|银行|[大中小]学|部||局|厂|店|所|队|社|室|厅|段|会|场)$",
+                "regstr": ".{2,100}(委员会|办公室|学校|幼儿园|动物园|管理站|图书馆|殡仪馆|博物馆|基地|青年宫|少年宫|艺术宫|电视台|协会|政府|初中|集团|银行|[大中小]学|院|厂|店|所|队|社|室|厅|段|会|场)$",
                 "score": 3
             }
         ],
         "negativewords": [
             {
                 "describe": "包含负分",
-                "regstr": "(附件|招标失败|采购中心|交易中心|不足|公告|变更|招标|废标|废止|流标|中标|投标|评标|开标|供应商|金额|万元|元整|预算|报价|单价|第(\\d|一|二|三|四|五)(名|包)|排名|候选|确定|标段|(标|一|二|三|四|五)包|中选|成交|包号|(A|B|C|D|E|F|G)包|地址|详情|要求|推荐|名称|评审|得分|合同|平方米|公示期|结果|备注|说明|单位|代表|委托|工作日|营业(执|期)|通过|代码|电话|联系|条件|合理|费率|以上|以下|拟定|为|注:|\\d[\\s]{0,10}(\\.|元|包|米|平米|平方米|吨|辆|千克|克|毫克|毫升|公升|套|件|瓶|箱|只|台|年|月|日|天|号)|(:|:|;|;|?|¥|\\*|%)|^[a-zA-Z0-9-]{5,100}|^[a-zA-Z0-9-]{1,100}$|[a-zA-Z0-9-]{10,100})",
+                "regstr": "(附件|委托|代理|咨询|管理有限公司|管理顾问|招标失败|交易中心|不足|公告|变更|招标|废标|废止|流标|中标|评标|开标|供应商|金额|万元|元整|预算|报价|单价|第(\\d|一|二|三|四|五)(名|包)|排名|候选|确定|标段|(标|一|二|三|四|五)包|中选|成交|包号|(A|B|C|D|E|F|G)包|地址|详情|要求|推荐|名称|评审|得分|合同|平方米|公示期|结果|备注|说明|单位|代表|委托|工作日|营业(执|期)|通过|代码|电话|联系|条件|合理|费率|以上|以下|拟定|为|注:|\\d[\\s]{0,10}(\\.|元|包|米|平米|平方米|吨|辆|千克|克|毫克|毫升|公升|套|件|瓶|箱|只|台|年|月|日|天|号)|(:|:|;|;|?|¥|\\*|%)|^[a-zA-Z0-9-]{5,100}|^[a-zA-Z0-9-]{1,100}$|[a-zA-Z0-9-]{10,100})",
                 "score": -5
             }
         ],
@@ -138,14 +138,14 @@
                 "describe": "[gt,lte,score]",
                 "range": [
                     0,
-                    4,
-                    -3
+                    3,
+                    -5
                 ]
             },
             {
                 "describe": "[gt,lte,score]",
                 "range": [
-                    4,
+                    3,
                     25,
                     3
                 ]
@@ -365,6 +365,11 @@
                 "describe": "标段编号匹配-2",
                 "regstr": "/.{2}",
                 "score": -2
+            },
+            {
+                "describe": "-结束没有抽取完",
+                "regstr": "-$",
+                "score": -1
             }
         ],
         "length": [