zhangjinkun 6 роки тому
батько
коміт
e7d65b2454
36 змінених файлів з 1278 додано та 160 видалено
  1. 4 4
      src/jy/admin/clear.go
  2. 26 4
      src/jy/admin/track/track.go
  3. 68 46
      src/jy/extract/extract.go
  4. 29 18
      src/jy/extract/extractInit.go
  5. 5 1
      src/jy/pretreated/analystep.go
  6. 5 2
      src/jy/pretreated/analytable.go
  7. 8 5
      src/jy/pretreated/colonkv.go
  8. 5 4
      src/jy/util/article.go
  9. 2 63
      src/jy/util/config.go
  10. 30 13
      src/jy/util/tagmatch.go
  11. 161 0
      src/res/blocktagdb/中标单位.txt
  12. 99 0
      src/res/blocktagdb/中标单位地址.txt
  13. 26 0
      src/res/blocktagdb/中标日期.txt
  14. 107 0
      src/res/blocktagdb/中标金额.txt
  15. 4 0
      src/res/blocktagdb/代理机构地址.txt
  16. 7 0
      src/res/blocktagdb/代理机构联系人.txt
  17. 4 0
      src/res/blocktagdb/代理机构联系电话.txt
  18. 0 0
      src/res/blocktagdb/币种.txt
  19. 185 0
      src/res/blocktagdb/开标日期.txt
  20. 0 0
      src/res/blocktagdb/成交状态.txt
  21. 15 0
      src/res/blocktagdb/招标机构.txt
  22. 2 0
      src/res/blocktagdb/拟成交供应商.txt
  23. 0 0
      src/res/blocktagdb/拟成交供应商地址.txt
  24. 0 0
      src/res/blocktagdb/汇率.txt
  25. 0 0
      src/res/blocktagdb/监理项目费率.txt
  26. 63 0
      src/res/blocktagdb/资格条件.txt
  27. 1 0
      src/res/blocktagdb/资金来源.txt
  28. 11 0
      src/res/blocktagdb/采购单位.txt
  29. 11 0
      src/res/blocktagdb/采购单位地址.txt
  30. 13 0
      src/res/blocktagdb/采购单位联系人.txt
  31. 14 0
      src/res/blocktagdb/采购单位联系电话.txt
  32. 103 0
      src/res/blocktagdb/项目名称.txt
  33. 1 0
      src/res/blocktagdb/项目类型.txt
  34. 128 0
      src/res/blocktagdb/项目编号.txt
  35. 33 0
      src/res/blocktagdb/项目范围.txt
  36. 108 0
      src/res/blocktagdb/预算.txt

+ 4 - 4
src/jy/admin/clear.go

@@ -24,7 +24,7 @@ func init() {
 //加载数据
 func ClearData(c *gin.Context) {
 	version, _ := c.GetPostForm("version")
-	data, _ := Mgo.Find("cleanup", `{"s_version":"`+version+`","delete":true}`, `{"_id":-1}`, nil, false, -1, -1)
+	data, _ := Mgo.Find("cleanup", `{"s_version":"`+version+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
 	for _, d := range *data {
 		timeStr := time.Unix(d["l_intime"].(int64), 0).Format(Date_Short_Layout)
 		d["l_intime"] = timeStr
@@ -56,7 +56,7 @@ func ClearSave(c *gin.Context) {
 		username, _ := c.GetPostForm("username")
 		fieldname, _ := c.GetPostForm("fieldname")
 		fieldArr := strings.Split(fieldname, "+")
-		data, _ := Mgo.FindOne("cleanup", `{"s_version":"`+version+`","s_field":"`+fieldArr[1]+`","delete":true}`)
+		data, _ := Mgo.FindOne("cleanup", `{"s_version":"`+version+`","s_field":"`+fieldArr[1]+`","delete":false}`)
 		if len(*data) > 0 { //创建判重
 			c.JSON(200, gin.H{"rep": false})
 			return
@@ -69,7 +69,7 @@ func ClearSave(c *gin.Context) {
 			"s_name":    fieldArr[0],
 			"clear":     clear,
 			"clearInfo": clearInfo,
-			"delete":    true,
+			"delete":    false,
 		}
 		b := Mgo.Save("cleanup", save)
 		if b != "" {
@@ -96,7 +96,7 @@ func ClearSave(c *gin.Context) {
 func ClearDel(c *gin.Context) {
 	_id, _ := c.GetPostForm("_id")
 	b := Mgo.Update("cleanup", `{"_id":"`+_id+`"}`, map[string]interface{}{
-		"$set": map[string]interface{}{"delete": false},
+		"$set": map[string]interface{}{"delete": true},
 	}, false, false)
 	if b {
 		c.JSON(200, gin.H{"rep": true})

+ 26 - 4
src/jy/admin/track/track.go

@@ -4,6 +4,7 @@ package track
 import (
 	db "jy/mongodbutil"
 	qu "qfw/util"
+	"strings"
 )
 
 //获取抽取路径
@@ -37,13 +38,14 @@ func GetTrackPath(_id, field, table, resultcoll string) map[string]interface{} {
 					if tmp, ok := v.(map[string]interface{}); ok {
 						if code == tmp["code"] {
 							path := map[string]interface{}{
-								"type":      info["type"],
-								"code":      info["code"],
-								"name":      info["name"],
-								"ruletext":  info["ruletext"],
+								"type": info["type"],
+								"code": info["code"],
+								"name": info["name"],
+								//"ruletext":  info["ruletext"],
 								"value":     tmp["value"],
 								"extfrom":   tmp["extfrom"],
 								"matchtype": tmp["matchtype"],
+								"kvtype":    tmp["type"],
 							}
 							paths = append(paths, path)
 						}
@@ -53,5 +55,25 @@ func GetTrackPath(_id, field, table, resultcoll string) map[string]interface{} {
 		}
 		tracks[code] = paths
 	}
+	//针对lua抽取kv路径拆分
+	luatracks := map[string][]map[string]interface{}{}
+	for k, v := range tracks {
+		if strings.Contains(k, "CL") {
+			track, _ := v.([]map[string]interface{})
+			for _, val := range track { //按code,kvtype,matchtype分组
+				code := k + "_" + qu.ObjToString(val["kvtype"]) + "_" + qu.ObjToString(val["matchtype"])
+				tmps := luatracks[code]
+				if tmps == nil {
+					tmps = []map[string]interface{}{}
+				}
+				tmps = append(tmps, val)
+				luatracks[code] = tmps
+			}
+			delete(tracks, k)
+		}
+	}
+	for k, v := range luatracks {
+		tracks[k] = v
+	}
 	return tracks
 }

+ 68 - 46
src/jy/extract/extract.go

@@ -1,6 +1,7 @@
 package extract
 
 import (
+	"encoding/json"
 	//"encoding/json"
 	"fmt"
 	"jy/clear"
@@ -195,6 +196,12 @@ func PreInfo(doc map[string]interface{}) *ju.Job {
 
 //抽取
 func (e *ExtractTask) ExtractProcess(j *ju.Job) {
+	if 1 == 2 {
+		for k, v := range j.Block {
+			bs, _ := json.Marshal(v.TableKV)
+			log.Println("Block TableKV", k, string(bs))
+		}
+	}
 	qu.Catch()
 	qu.Try(func() {
 		doc := *j.Data
@@ -241,8 +248,8 @@ func (e *ExtractTask) ExtractProcess(j *ju.Job) {
 				v.Value = data[0]
 			}
 		}
-		//bs, _ := json.Marshal(j.Result)
-		//log.Println("抽取结果", j.Title, j.SourceMid, string(bs))
+		bs, _ := json.Marshal(j.Result)
+		log.Println("抽取结果", j.Title, j.SourceMid, string(bs))
 
 		//抽取省份城市县
 
@@ -287,11 +294,7 @@ 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) {
 	if in.IsLua {
 		lua := ju.LuaScript{Code: in.Code, Name: in.Name, Doc: doc, Script: in.RuleText}
-		if in.IsHasFields { //lua脚本配置有属性字段
-			lua.KvMap = getKvByLuaFields(extfrom, j, in, et.Tag)
-		} else {
-			lua.KvMap = map[string][]map[string]interface{}{}
-		}
+		lua.KvMap = getKvByLuaFields(extfrom, j, in, et.Tag)
 		lua.Block = j.Block
 		extinfo := lua.RunScript("core")
 		for k, v := range extinfo {
@@ -323,14 +326,15 @@ func ExtRegCore(extfrom string, doc map[string]interface{}, j *ju.Job, in *RegLu
 //lua脚本根据属性设置提取kv值
 func getKvByLuaFields(extfrom string, j *ju.Job, in *RegLuaInfo, t map[string][]*Tag) map[string][]map[string]interface{} {
 	kvmap := map[string][]map[string]interface{}{}
-	for _, vv := range in.LFields {
-		field := qu.ObjToString(vv)
-		tags := t[qu.ObjToString(vv)] //获取对应标签库
+	for fieldname, field := range in.LFields {
+		tags := t[field] //获取对应标签库
 		for _, bl := range j.Block {
 			//冒号kv
 			if bl.ColonKV != nil {
 				kvs := bl.ColonKV.Kvs
 				kvs2 := bl.ColonKV.Kvs_2
+				//log.Println("ColonKV1", kvs)
+				//log.Println("ColonKV2", kvs2)
 				for _, tag := range tags {
 					for _, kv := range kvs {
 						if tag.Type == "string" {
@@ -407,6 +411,7 @@ func getKvByLuaFields(extfrom string, j *ju.Job, in *RegLuaInfo, t map[string][]
 			//空格kv
 			if bl.SpaceKV != nil {
 				kvs := bl.SpaceKV.Kvs
+				//log.Println("SpaceKV", kvs)
 				for _, tag := range tags {
 					for _, kv := range kvs {
 						if tag.Type == "string" {
@@ -447,44 +452,61 @@ func getKvByLuaFields(extfrom string, j *ju.Job, in *RegLuaInfo, t map[string][]
 			}
 			//表格kv
 			if bl.TableKV != nil {
-				kv := bl.TableKV.Kv
-				for _, tag := range tags {
-					for k, val := range kv {
-						if tag.Type == "string" {
-							if k == tag.Key {
-								text := ju.TrimLRSpace(val, "")
-								if text != "" {
-									kvmap[field] = append(kvmap[field], map[string]interface{}{
-										"field":     field,
-										"code":      in.Code,
-										"ruletext":  tag.Key,
-										"extfrom":   extfrom,
-										"value":     text,
-										"type":      "table",
-										"matchtype": "tag_string",
-									})
-								}
-								break
-							}
-						} else if tag.Type == "regexp" {
-							if tag.Reg.MatchString(k) {
-								text := ju.TrimLRSpace(val, "")
-								if text != "" {
-									kvmap[field] = append(kvmap[field], map[string]interface{}{
-										"field":     field,
-										"code":      in.Code,
-										"ruletext":  tag.Key,
-										"extfrom":   extfrom,
-										"value":     text,
-										"type":      "table",
-										"matchtype": "tag_regexp",
-									})
-								}
-								break
-							}
-						}
+				tkv := bl.TableKV
+				//log.Println("tkv", tkv)
+				for k, v := range tkv.Kv {
+					if k == fieldname {
+						//log.Println(k, v, tags[-tkv.KvIndex[fieldname]].Key)
+						kvmap[field] = append(kvmap[field], map[string]interface{}{
+							"field":     field,
+							"code":      in.Code,
+							"ruletext":  tags[-tkv.KvIndex[fieldname]].Key,
+							"extfrom":   "table",
+							"value":     v,
+							"type":      "table",
+							"matchtype": "tag_string",
+						})
 					}
 				}
+
+				//				kv := bl.TableKV.Kv
+				//				for _, tag := range tags {
+				//					for k, val := range kv {
+				//						if tag.Type == "string" {
+				//							if k == tag.Key {
+				//								text := ju.TrimLRSpace(val, "")
+				//								if text != "" {
+				//									kvmap[field] = append(kvmap[field], map[string]interface{}{
+				//										"field":     field,
+				//										"code":      in.Code,
+				//										"ruletext":  tag.Key,
+				//										"extfrom":   extfrom,
+				//										"value":     text,
+				//										"type":      "table",
+				//										"matchtype": "tag_string",
+				//									})
+				//								}
+				//								break
+				//							}
+				//						} else if tag.Type == "regexp" {
+				//							if tag.Reg.MatchString(k) {
+				//								text := ju.TrimLRSpace(val, "")
+				//								if text != "" {
+				//									kvmap[field] = append(kvmap[field], map[string]interface{}{
+				//										"field":     field,
+				//										"code":      in.Code,
+				//										"ruletext":  tag.Key,
+				//										"extfrom":   extfrom,
+				//										"value":     text,
+				//										"type":      "table",
+				//										"matchtype": "tag_regexp",
+				//									})
+				//								}
+				//								break
+				//							}
+				//						}
+				//					}
+				//				}
 			}
 		}
 	}

+ 29 - 18
src/jy/extract/extractInit.go

@@ -3,19 +3,21 @@ package extract
 
 import (
 	db "jy/mongodbutil"
+	ju "jy/util"
 	"log"
 	qu "qfw/util"
 	"regexp"
+	"sort"
 	"strings"
 )
 
 type RegLuaInfo struct { //正则或脚本信息
-	Code, Name, Field  string        //
-	RuleText           string        //
-	IsLua, IsHasFields bool          //IsHasFields正则配置有属性字段
-	RegPreBac          *ExtReg       //
-	RegCore            *ExtReg       //
-	LFields            []interface{} //lua抽取字段属性组
+	Code, Name, Field string            //
+	RuleText          string            //
+	IsLua             bool              //
+	RegPreBac         *ExtReg           //
+	RegCore           *ExtReg           //
+	LFields           map[string]string //lua抽取字段属性组
 }
 type ExtReg struct {
 	Reg        *regexp.Regexp
@@ -276,13 +278,8 @@ func (e *ExtractTask) InitRuleCore() {
 				}
 				if rinfo.IsLua {
 					rinfo.RuleText = v["s_luascript"].(string)
-					//暂时提取全部属性
+					//提取全部属性
 					rinfo.LFields = getALLFields()
-					rinfo.IsHasFields = true
-					/*rinfo.LFields, _ = v["s_fields"].([]interface{})
-					if len(rinfo.LFields) > 0 {
-						rinfo.IsHasFields = true
-					}*/
 				} else {
 					qu.Try(func() {
 						rinfo.RuleText = v["s_rule"].(string)
@@ -325,10 +322,17 @@ func (e *ExtractTask) InitTag() {
 	for _, v := range *list {
 		field := qu.ObjToString(v["s_field"])
 		if tmp, ok := v["content"].([]interface{}); ok {
-			for _, key := range tmp {
+			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
 		}
 	}
 	//正则标签库
@@ -336,20 +340,27 @@ func (e *ExtractTask) InitTag() {
 	for _, v := range *list {
 		field := qu.ObjToString(v["s_field"])
 		if tmp, ok := v["content"].([]interface{}); ok {
-			for _, key := range tmp {
+			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() []interface{} {
-	fields := []interface{}{}
-	list, _ := db.Mgo.Find("fields", `{}`, nil, `{"s_field":1}`, false, -1, -1)
+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 = append(fields, v["s_field"])
+		fields[qu.ObjToString(v["s_name"])] = qu.ObjToString(v["s_field"])
 	}
 	return fields
 }

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

@@ -65,7 +65,11 @@ func processTableResult(tabres *TableResult, block *util.Block) {
 	for k, v := range tabres.SortKV.Map {
 		kv[k] = qutil.ObjToString(v)
 	}
-	block.TableKV = &util.JobKv{Kv: kv}
+	kvIndex := map[string]int{}
+	for k, v := range tabres.SortKVWeight {
+		kvIndex[k] = v
+	}
+	block.TableKV = &util.JobKv{Kv: kv, KvIndex: kvIndex}
 }
 
 //一行多列 一列多行,按照分块逻辑处理

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

@@ -108,6 +108,7 @@ func IsHide(g *goquery.Selection) (b bool) {
 }
 
 //对表格的key进行标准化处理,多个k相同时,出现覆盖问题
+//待扩展,暂不支持正则标签库
 func CommonDataAnaly(k, tabletag, tabledesc string, v interface{}) (k1 []string, weight []int, v1, returntag string, b bool) {
 	k1 = []string{}
 	weight = []int{}
@@ -127,6 +128,7 @@ func CommonDataAnaly(k, tabletag, tabledesc string, v interface{}) (k1 []string,
 	//u.Debug(2, k)
 	//取标准key
 	res := u.GetTags(k)
+
 	if len(res) == 0 && tk != k {
 		res = u.GetTags(tk)
 	}
@@ -252,6 +254,7 @@ func (table *Table) KVFilter() {
 		v := table.SortKV.Map[k]
 		//u.Debug(k, v)
 		if _, ok := v.(string); ok {
+
 			k = regSpliteSegment.ReplaceAllString(regReplAllSpace.ReplaceAllString(k, ""), "")
 			k1, w1, v1, tag, b := CommonDataAnaly(k, table.Tag, table.Desc, v)
 			//u.Debug(k, v, k1, w1, v1, tag, b)
@@ -281,14 +284,14 @@ func (table *Table) KVFilter() {
 		} else {
 			//u.Debug(k, v, "---------")
 			as.AddKey(k, v)
+
 		}
 	}
 	//处理值是数组的kv放入标准化kv中
 	checkKey := map[int]bool{}
 	for kn, k := range as.Keys {
 		v := as.Map[k]
-		vm, ok := v.([]map[string]interface{})
-		if k == NullTxtBid && ok {
+		if vm, ok := v.([]map[string]interface{}); ok && k == NullTxtBid {
 			if table.WinnerOrder == nil {
 				table.WinnerOrder = []map[string]interface{}{}
 			}

+ 8 - 5
src/jy/pretreated/colonkv.go

@@ -640,7 +640,7 @@ func GetKVAll(content, title string, from int) *JobKv {
 func KvTagsToKV(findkvs []*Kv, title string, tagdbs []string, from int) (map[string]string, map[string]*Tag) {
 	kvTags := map[string]*Tag{}
 	if title != "" && BlockTagMap[title] {
-		kvTags[title] = &Tag{title, 0}
+		kvTags[title] = &Tag{title, 0, nil}
 	}
 	for _, findkv := range findkvs {
 		kvMap := map[string]string{}
@@ -677,17 +677,20 @@ func KvTagsToKV(findkvs []*Kv, title string, tagdbs []string, from int) (map[str
 			//Debug(key)
 			//continue
 			//由跳过修改为保留
-			tags = []*Tag{&Tag{k, -100}}
+			tags = []*Tag{&Tag{k, -100, nil}}
 		}
 		for _, tk := range tags {
 			//分包过来给kv打标签的时候,只取第一个,后面的不覆盖
 			if kvTags[tk.Value] == nil || (kvTags[tk.Value].Weight < tk.Weight && from != 4) {
-				fc := StandardNameMap[tk.Value]
-				if (fc != nil && fc.CheckNum) || (moneyreg.MatchString(tk.Value)) {
+				//				fc := StandardNameMap[tk.Value]
+				//				if (fc != nil && fc.CheckNum) || (moneyreg.MatchString(tk.Value)) {
+				//					val += GetMoneyUnit(k, val)
+				//				}
+				if moneyreg.MatchString(tk.Value) {
 					val += GetMoneyUnit(k, val)
 				}
 				//Debug("KV-key", tk, val)
-				kvTags[tk.Value] = &Tag{val, tk.Weight}
+				kvTags[tk.Value] = &Tag{val, tk.Weight, nil}
 				kvMap[tk.Value] = val
 				//Debug("KV-key", tk.Value, val, key, tk.Weight)
 			}

+ 5 - 4
src/jy/util/article.go

@@ -75,10 +75,11 @@ type Kv struct {
 
 //最终放到job上的kv
 type JobKv struct {
-	Kvs   []*Kv             //有序的冒号kv
-	Kvs_2 []*Kv             //有序的冒号kv
-	Kv    map[string]string //table kv (分出的对应的KV值)
-	KvTag map[string]*Tag   //带权重的kv
+	Kvs     []*Kv             //有序的冒号kv
+	Kvs_2   []*Kv             //有序的冒号kv
+	Kv      map[string]string //table kv (分出的对应的KV值)
+	KvIndex map[string]int    //kv_index(流程)
+	KvTag   map[string]*Tag   //带权重的kv
 }
 
 func NewJobKv() *JobKv {

+ 2 - 63
src/jy/util/config.go

@@ -6,76 +6,15 @@ import (
 	"os"
 	"qfw/util"
 	"regexp"
-	"sync"
-
-	"github.com/dlclark/regexp2"
-)
-
-const (
-	EXTRACT_Original = iota
-	EXTRACT_Fun
-	EXTRACT_ColonKV
-	EXTRACT_SpaceKV
-	EXTRACT_TableKV
-	EXTRACT_TitleReg
-	EXTRACT_BlockReg
-	EXTRACT_TextReg
-	EXTRACT_PagReg
 )
 
 //全局配置
 var FormatTextMap map[string][]map[string]interface{}
-var StandardNameMap = map[string]*NodeConfig{}
-
-/*单个字段抽取环节配置
-正常抽取,只用写配置正则就可以了
-对于复杂的抽取,支持用GO写方法,平台直接调用方法
-*/
-type NodeConfig struct {
-	Code          string   `json:"code"`
-	Field         string   `json:"field"`
-	Descript      string   `json:"descript"`
-	DomainMatch   string   `json:"domainmatch"`
-	PreRegStr     []string `json:"prereg"`
-	PreReg        []map[*regexp.Regexp]string
-	RegStr        []string `json:"reg"` //抽取用得正则
-	Reg           []*ExtractReg
-	PackageRegStr []string `json:"packagereg"` //分包抽取用得正则
-	PackageReg    []*ExtractReg
-	TitleRegStr   []string `json:"titlereg"` //抽取用得正则
-	TitleReg      []*ExtractReg
-	EndRegStr     string `json:"endreg"`
-	EndReg        *regexp.Regexp
-	Fn            string   `json:"fn"`    //
-	Clear         []string `json:"clear"` //抽取后用于清理的方法链
-	//其他配置项,或者限制条件
-	NeedSave            bool                         `json:"needsave"` // 是否保存
-	DefaultVal          map[string]interface{}       `json:"defaultval"`
-	EndFilter           []string                     `json:"endfilter"`
-	EndFilterArray      []map[*regexp.Regexp]string  //结尾过滤正则
-	KvEndFilter         []string                     `json:"kvendfilter"`
-	KvEndFilterArray    []map[*regexp2.Regexp]string //kv清理过滤正则
-	TitleEndFilter      []string                     `json:"titlendfilter"`
-	TitleEndFilterArray []map[*regexp2.Regexp]string //kv清理过滤正则
-	CheckNum            bool                         `json:"checknum"`
-}
-
-type ExtractReg struct {
-	Reg        *regexp.Regexp
-	Bextract   bool
-	ExtractPos int
-}
-
-/**
-  分类配置
-*/
-
-var NodeConfigs map[string] /*分类代码*/ map[string] /*domain代码*/ *NodeConfig //字段抽取配置
-var Schemas map[string][]string                                           //
-var lock sync.Mutex
 
 func init() {
 	loadFormatText()
+	LoadTagDb("./res/tagdb")
+	LoadTagDb("./res/blocktagdb")
 }
 
 //加载格式化正文配置

+ 30 - 13
src/jy/util/tagmatch.go

@@ -4,6 +4,7 @@ import (
 	"io/ioutil"
 	"os"
 	"path/filepath"
+	"regexp"
 	"sort"
 	"strings"
 )
@@ -12,11 +13,13 @@ import (
 type Tag struct {
 	Value  string //
 	Weight int    //权重
+	TagReg *regexp.Regexp
 }
 type Tags []*Tag //
 //tag文件
 type TagFile struct {
 	Name  string //
+	Type  string // reg
 	Items Tags   //数据
 }
 
@@ -32,7 +35,7 @@ func (s Tags) Less(i, j int) bool {
 }
 
 //
-var tagdb = make(map[string]*TagFile)
+var TagdbTable = make(map[string]*TagFile)
 var blocktagdb = make(map[string]*TagFile)
 
 //加载
@@ -47,7 +50,7 @@ func (t *TagFile) Load(path string) {
 	//排序
 	t.Items = make([]*Tag, len(lines))
 	for k, v := range lines {
-		t.Items[k] = &Tag{v, 0 - k}
+		t.Items[k] = &Tag{v, 0 - k, nil}
 	}
 	sort.Sort(t.Items)
 	t.Name = name
@@ -55,7 +58,7 @@ func (t *TagFile) Load(path string) {
 
 //快速匹配
 func (t *TagFile) Match(src string) (bool, *Tag) {
-	pos := binarysearch(t.Items, 0, len(t.Items)-1, src)
+	pos := binarysearch(t.Items, 0, len(t.Items)-1, src, t.Type)
 	if pos < 0 {
 		return false, nil
 	} else {
@@ -65,7 +68,7 @@ func (t *TagFile) Match(src string) (bool, *Tag) {
 }
 
 //2分查找,返回位置
-func binarysearch(arr Tags, begin, end int, key string) int {
+func binarysearch(arr Tags, begin, end int, key, types string) int {
 	if begin > end {
 		return -1
 	}
@@ -73,12 +76,22 @@ func binarysearch(arr Tags, begin, end int, key string) int {
 	if mid < 0 {
 		return -1
 	}
-	if arr[mid].Value == key {
-		return mid
-	} else if arr[mid].Value > key {
-		return binarysearch(arr, begin, mid-1, key)
+	if types == "reg" {
+		if arr[mid].TagReg.MatchString(key) {
+			return mid
+		} else if arr[mid].Value > key {
+			return binarysearch(arr, begin, mid-1, key, types)
+		} else {
+			return binarysearch(arr, mid+1, end, key, types)
+		}
 	} else {
-		return binarysearch(arr, mid+1, end, key)
+		if arr[mid].Value == key {
+			return mid
+		} else if arr[mid].Value > key {
+			return binarysearch(arr, begin, mid-1, key, types)
+		} else {
+			return binarysearch(arr, mid+1, end, key, types)
+		}
 	}
 }
 
@@ -91,9 +104,11 @@ func LoadTagDb(respath string) {
 		if strings.HasSuffix(info.Name(), ".txt") {
 			t := &TagFile{}
 			t.Load(path)
-			if strings.HasSuffix(respath, "/tagdb") {
-				tagdb[t.Name] = t
-			} else if strings.HasSuffix(respath, "/blocktagdb") {
+			//tagdb数据源从库里查
+			//			if strings.HasSuffix(respath, "/tagdb") {
+			//				TagdbTable[t.Name] = t
+			//			}
+			if strings.HasSuffix(respath, "/blocktagdb") {
 				blocktagdb[t.Name] = t
 			}
 		}
@@ -116,7 +131,7 @@ func GetAppointTags(src string, array []string) Tags {
 			m[v] = true
 		}
 	}
-	for k, v := range tagdb {
+	for k, v := range TagdbTable {
 		if len(m) > 0 && !m[k] {
 			continue
 		}
@@ -124,6 +139,7 @@ func GetAppointTags(src string, array []string) Tags {
 			ret = append(ret, &Tag{
 				v.Name,
 				tag.Weight,
+				tag.TagReg,
 			})
 		}
 	}
@@ -140,6 +156,7 @@ func GetBlockTags(src string) Tags {
 			ret = append(ret, &Tag{
 				v.Name,
 				tag.Weight,
+				nil,
 			})
 		}
 	}

+ 161 - 0
src/res/blocktagdb/中标单位.txt

@@ -0,0 +1,161 @@
+中标单位
+中选单位
+成交单位
+中标供应商
+中标候选单位
+成交社会资本
+成交社会资本方
+抽签确定中标单位
+推荐的成交供应商
+确定中标供应商
+确定预成交供应商
+资审预审入围单位
+预中标供应商
+预中标单位
+预中标结果
+预成交供应商
+预成交供应商排序
+预成交社会投资方
+预成交社会资本为
+预成交社会资本方
+第一标段中标供应商名称
+确定中标企业名称
+拟定成交供应商名称
+拟成交供应商名称
+成交单位名称
+成交人名称
+中标成交供应商名称
+中标单位名称
+中标候选人名称
+中标人名称
+原中标候选人
+成交人
+成交候选人
+招标推荐中标候选人
+推荐中选人
+现中标候选人
+推荐中标候选人
+推荐中标候选人名单
+推荐中标候选人排序
+确定入围评标投标人
+第一中标侯选人
+第一中标候选人
+第一包中标人
+预中标人
+询价小组推荐的成交候选人
+第三中标候选人
+第二中标候选人
+中标候选人名单
+中标候选人排名
+中标候选人的变更
+中标供应商名称
+中标
+中标人
+中标人名单
+候选中标供应商名单
+中标候选供应商名单
+中标投标人名单
+成交供应商名单
+成交候选供应商名单
+入围供应商
+入围单位
+候选中标供应商有
+成交供应商及成交金额
+成交供应商名称
+中标成交结果
+中标结果如下
+主要成交条件
+原成交信息
+开标结果
+成交事项
+成交结果如下
+招标结果
+推荐结果
+现对中标公告做出如下更改
+现对中标结果做出如下更改
+确定成交
+磋商小组成员评审结果
+磋商结果
+经专家评定中标结果如下
+经专家评定成交结果如下
+结果公告
+结果公示
+结果简要说明
+评标委员会成员评审结果
+评标委员会评审结果
+评标小组成员评审结果
+评标结果公示如下
+评标结果如下
+询价小组成员评审结果
+询价结果
+谈判结果
+资格预审结果
+资格预审评审结果
+遴选结果
+采购小组成员评审结果
+采购结果
+预成交结果
+成交供应商情况
+成交供应商的确定
+成交供应商确定
+竞争性谈判结果信息
+项目标段结果信息
+公开招标结果信息
+谈判结果信息
+谈判结果内容
+采购成交信息
+采购结果信息
+成交供应商信息
+成交供应商主要信息
+成交信息
+预成交供应商信息
+预成交信息
+项目公示信息
+项目结果信息
+结果内容
+结算单公告信息
+第一中标候选人情况
+本次采购结果信息
+本项目成交信息
+磋商成交信息
+磋商结果信息
+评审结果情况
+评标结果信息
+成交结果
+成交情况
+成交内容
+成交标的情况
+成交标的的内容
+成交结果信息
+成交标的具体情况
+中标候选人
+中标人信息
+中标供应商信息
+中标候选人信息
+中标候选人情况
+中标内容
+中标单位信息
+中标基本情况
+中标基本概况
+中标成交结果信息
+中标标的情况
+中标结果主要内容
+中标结果信息
+中标结果内容
+中选人信息
+主要中标标的信息
+主要中标标的的信息
+主要成交标的信息
+主要预中标标的信息
+中标候选人主要信息
+中标信息
+中标情况
+评标结果
+成交确认
+询价结果信息
+预中标信息
+中标结果
+成交公告中变更信息
+变更事项
+更正信息
+更正事项

+ 99 - 0
src/res/blocktagdb/中标单位地址.txt

@@ -0,0 +1,99 @@
+成交供应商地址
+中标供应商地址
+中标单位地址
+预中标供应商地址
+成交单位地址
+预中标供应商住所
+成交信息
+成交结果
+成交确认
+成交情况
+成交标的具体情况
+成交内容
+成交标的情况
+成交标的的内容
+成交结果信息
+公开招标结果信息
+谈判结果信息
+谈判结果内容
+采购成交信息
+采购结果信息
+预成交供应商信息
+预成交信息
+项目公示信息
+项目结果信息
+结果内容
+结算单公告信息
+第一中标候选人情况
+本次采购结果信息
+本项目成交信息
+磋商成交信息
+磋商结果信息
+评审结果情况
+评标结果信息
+中标
+中标候选人
+中标候选人主要信息
+中标人信息
+中标供应商信息
+中标候选人信息
+中标候选人情况
+中标内容
+中标单位信息
+中标基本情况
+中标基本概况
+中标成交结果信息
+中标标的情况
+中标结果主要内容
+中标结果信息
+中标结果内容
+中选人信息
+主要中标标的信息
+主要中标标的的信息
+主要成交标的信息
+主要预中标标的信息
+中标成交结果
+中标结果如下
+主要成交条件
+原成交信息
+开标结果
+成交事项
+成交供应商情况
+成交供应商的确定
+成交供应商确定
+成交结果如下
+招标结果
+推荐结果
+现对中标公告做出如下更改
+现对中标结果做出如下更改
+确定成交
+磋商小组成员评审结果
+磋商结果
+经专家评定中标结果如下
+经专家评定成交结果如下
+结果公告
+结果公示
+结果简要说明
+评标委员会成员评审结果
+评标委员会评审结果
+评标小组成员评审结果
+评标结果公示如下
+评标结果如下
+询价小组成员评审结果
+询价结果
+谈判结果
+资格预审结果
+资格预审评审结果
+遴选结果
+采购小组成员评审结果
+采购结果
+预成交结果
+中标信息
+成交供应商名称
+成交供应商主要信息
+中标情况
+评标结果
+项目标段结果信息
+预中标信息
+成交公告中变更信息
+更正事项

+ 26 - 0
src/res/blocktagdb/中标日期.txt

@@ -0,0 +1,26 @@
+中标日期
+确认中标日期
+成交公示时间
+成交日期
+成交信息
+中标公告日期
+中标公告时间
+中标公示日期
+结果公告日期
+结果公告时间
+确定成交的时期
+结果公示期
+评标结果公示期
+确定成交供应商日期
+流标结果公示时间
+确定中标的日期
+招标结果确定日期
+成交结果公告时间
+成交时间
+定标成交日期
+采购结果公告时间
+采购结果公示日期
+中标信息
+中标情况
+预中标信息
+中标结果

+ 107 - 0
src/res/blocktagdb/中标金额.txt

@@ -0,0 +1,107 @@
+总成交额
+中标金额
+中标总额
+预中标金额
+成交金额
+成交总金额为
+成交价
+成交价人民币大写
+成交价格
+入围价格
+中标价格
+成交供应商主要信息
+成交信息
+成交内容
+成交标的情况
+成交标的的内容
+成交结果信息
+竞争性谈判结果信息
+项目标段结果信息
+公开招标结果信息
+谈判结果信息
+谈判结果内容
+采购成交信息
+采购结果信息
+预成交供应商信息
+预成交信息
+项目公示信息
+项目结果信息
+中标成交结果
+中标结果如下
+主要成交条件
+原成交信息
+开标结果
+成交事项
+成交供应商情况
+成交供应商的确定
+成交供应商确定
+成交结果如下
+招标结果
+推荐结果
+现对中标公告做出如下更改
+现对中标结果做出如下更改
+确定成交
+磋商小组成员评审结果
+磋商结果
+经专家评定中标结果如下
+经专家评定成交结果如下
+结果公告
+结果公示
+结果简要说明
+评标委员会成员评审结果
+评标委员会评审结果
+评标小组成员评审结果
+评标结果公示如下
+评标结果如下
+询价小组成员评审结果
+询价结果
+谈判结果
+资格预审结果
+资格预审评审结果
+遴选结果
+采购小组成员评审结果
+采购结果
+预成交结果
+结果内容
+结算单公告信息
+第一中标候选人情况
+本次采购结果信息
+本项目成交信息
+磋商成交信息
+磋商结果信息
+评审结果情况
+评标结果信息
+成交结果
+成交情况
+成交标的具体情况
+中标
+中标信息
+中标候选人
+中标候选人主要信息
+中标情况
+中标人信息
+中标供应商信息
+中标候选人信息
+中标候选人情况
+中标内容
+中标单位信息
+中标基本情况
+中标基本概况
+中标成交结果信息
+中标标的情况
+中标结果主要内容
+中标结果信息
+中标结果内容
+中选人信息
+主要中标标的信息
+主要中标标的的信息
+主要成交标的信息
+主要预中标标的信息
+评标结果
+成交确认
+询价结果信息
+预中标信息
+中标结果
+成交公告中变更信息
+变更事项
+更正事项

+ 4 - 0
src/res/blocktagdb/代理机构地址.txt

@@ -0,0 +1,4 @@
+代理机构地址
+招标代理机构地址
+招标代理机构详细地址
+采购代理机构地址

+ 7 - 0
src/res/blocktagdb/代理机构联系人.txt

@@ -0,0 +1,7 @@
+代理机构联系人
+招标代理机构联系人
+招标代理机构的联系人
+招标代理机构项目联系人
+采购代理机构项目联系人
+原公告中的采购代理机构联系人
+联系人

+ 4 - 0
src/res/blocktagdb/代理机构联系电话.txt

@@ -0,0 +1,4 @@
+代理机构联系电话
+招标代理机构联系电话
+采购代理机构联系电话传真
+联系电话

+ 0 - 0
src/res/blocktagdb/币种.txt


+ 185 - 0
src/res/blocktagdb/开标日期.txt

@@ -0,0 +1,185 @@
+开标时间
+投标开标时间
+投标截止时间
+磋商开始时间
+开标日期
+定标日期
+供应商提交响应文件截止时间
+供应商提交投标文件截止时间
+公开开标日期
+公开招标开标时间
+公示截止日期
+单一来源采购开标时间
+原公告中的开标时间
+原公告中的递交投标文件截止时间
+原开标时间
+原提交投标文件截止时间
+响应截止时间
+响应文件截止时间
+响应文件接收截止时间
+响应文件提交截止时间
+响应文件提交的截止时间
+响应文件的递交截止时间
+响应文件递交的截止时间
+延期后的确认参加投标截止时间
+延期开标时间
+开标会议时间
+开标定标日期
+开标截止时间
+开标时间原为
+开标时间变更为
+开标时间变更内容
+开标的时间
+开标评标时间
+截标开标时间
+投标开始时间
+投标截标时间
+投标截止日期
+投标截止时间变更为
+投标文件截止时间
+投标文件投递截止时间
+投标文件接受截止时间
+投标文件接收截止时间
+投标文件提交截止时间
+投标文件的递交时间
+投标文件递交开始时间
+投标文件递交截止日期
+投标文件递交截止时间
+投标文件递交截止时间暨开标时间
+投标文件递交截止时间更正为
+投标文件递交时间
+投标文件递交的截止时间
+投标文件递交起止时间
+投标时间
+投标起止日期
+投标递交截止时间
+报价文件递交截止日期
+招标投标截止时间
+接受投标截止时间
+接受投标文件截止时间
+接受投标文件的时间
+接受投标时间
+提交投标文件截止时间
+提交投标文件的截止时间
+提交电子响应文件截止时间
+提交磋商响应文件截止时间
+提交询价响应文件截止时间
+提交询价文件截止时间
+提交谈判响应文件时间
+提交谈判磋商文件截止时间
+提交首次响应文件截止时间
+本工程开标时间
+本项目原定开标时间
+本项目原投标文件递交截止时间为
+本项目开标时间
+本项目投标截止时间
+材料提交截止时间
+比选文件递交截止时间
+洽谈时间
+确认参加询价截止时间
+确认参加谈判截止时间
+磋商响应性文件递交截止时间
+磋商响应文件截止时间
+磋商响应文件接收截止时间
+磋商响应文件递交截止时间
+磋商响应文件递交截止时间暨竞争性磋商时间
+磋商截止时间
+磋商文件递交截止时间
+竞争性磋商文件截止时间
+竞争性谈判公告发布日期
+竞争性谈判公告发布时间
+竞争性谈判响应文件递交截止时间
+竞争性谈判文件的获取时间
+竞争性谈判文件领取时间地点
+竞争性谈判日期
+竞争性谈判时间
+竞标截止时间
+竞标文件递交截止时间
+计划开标时间
+计划投标截止时间
+询价响应性文件递交截止时间
+询价响应截止时间
+询价响应文件提交截止时间
+询价响应文件递交截止时间
+询价开标时间
+询价报价资料递交截止时间
+询价文件递交截止时间
+询价采购保证金递交截止时间
+谈判会时间
+谈判响应截止时间
+谈判响应文件的递交时间
+谈判响应文件递交截止时间
+谈判响应文件递交时间
+谈判响应文件递交的截止时间
+谈判响应文件递交起止时间
+谈判开始时间
+谈判截止时间
+谈判投标截止时间
+谈判文件截止时间
+谈判文件递交截止时间
+谈判磋商时间
+谈判评审日期
+资格预审开标时间
+资格预审文件递交截止时间
+资格预审申请书递交截止时间
+资格预审申请文件递交截止日期
+资格预审申请文件递交截止时间
+送达响应文件截止时间
+递交响应文件截止时间
+递交响应文件截止购时间递交响应文件地点
+递交响应文件的截止时间
+递交截止时间
+递交投标文件时间
+递交投标文件时间安排
+递交投标文件的截止时间
+递交投标文件的时间
+递交投标文件的时间地点
+递交报价文件截止时间
+递交磋商响应文件截止时间
+递交竞争性磋商响应文件截止时间
+递交竞争性谈判响应文件截止时间
+递交竞争性谈判文件时间
+递交竞标文件截止时间
+递交询价响应性文件截止时间
+递交询价响应文件截止时间
+递交询价文件截止时间
+递交谈判响应性文件时间
+递交谈判响应文件截止时间
+递交谈判响应文件时间
+递交谈判文件截止日期
+递交谈判文件时间
+首次响应文件提交截止时间
+首次响应文件递交截止时间
+提交谈判文件截止时间
+递交投标文件截止时间
+响应文件递交截止时间
+竞价文件提交截止时间
+确认参加投标截止时间
+提交响应文件截止时间
+报价文件递交截止时间
+谈判文件的递交
+谈判时间地点
+投标文件的递交
+资格审查文件接收信息
+询价采购开标信息
+开标有关信息
+开标相关信息
+询价信息
+采购项目情况
+项目采购内容
+开标信息
+投标文件
+招标文件中变更信息
+更改内容
+更改内容如下
+更正事项和内容
+更正内容及日期
+更正内容如下
+变更信息
+变更内容如下
+变更情况
+变更的事项内容
+磋商文件中变更信息
+本项目更正信息
+开标信息
+更正事项内容

+ 0 - 0
src/res/blocktagdb/成交状态.txt


+ 15 - 0
src/res/blocktagdb/招标机构.txt

@@ -0,0 +1,15 @@
+招标代理机构
+招标代理单位
+采购代理机构
+采购代理机构名称
+采购代理机构相关信息
+招标代理机构信息
+招标机构信息
+招标代理单位信息
+代理机构
+代理单位信息
+项目实施机构
+联系单位
+联系方式
+本次公告联系事项
+联系方式如下

+ 2 - 0
src/res/blocktagdb/拟成交供应商.txt

@@ -0,0 +1,2 @@
+拟中标供应商
+拟定唯一供应商

+ 0 - 0
src/res/blocktagdb/拟成交供应商地址.txt


+ 0 - 0
src/res/blocktagdb/汇率.txt


+ 0 - 0
src/res/blocktagdb/监理项目费率.txt


+ 63 - 0
src/res/blocktagdb/资格条件.txt

@@ -0,0 +1,63 @@
+资格条件
+资格要求
+资质条件
+供应商应具备下列资格条件
+供应商应具备下列资格条件并提供证明材料
+供应商必须具备的资格条件
+供应商的资格条件
+供应商资格条件
+供应商须同时具备以下资格条件
+参加投标的主要资格条件
+参加报价的供应商须具备以下资格条件
+合格供应商的资格条件
+合格供应商资格条件并需要提供的证明材料
+合格供应商资格条件要求
+合格投标人的资格条件
+合格投标人资格条件
+合格投标人资格条件如下
+合格报价人的资格条件
+合格的供应商应具备的资格条件
+合格的投标人应具备的资格条件
+响应供应商应具备的资格条件
+回复书面意见的供应商资格条件
+应征人资格条件
+投标人应具备的基本资格条件
+投标人应具备的资格条件
+投标人应当具备的资格条件
+投标人资格条件
+投标人资格条件满足
+投标人资格条件要求
+投标人须同时具备以下资格条件
+投标公司应具备资格条件
+投标单位资格条件
+投标申请人同时具备以下投标资格条件
+投标申请人应当具备的资格条件
+报价单位应具备的资格条件
+报名供应商应具备的资格条件
+申请人应当具备的主要资格条件
+社会资本应具备的资格条件
+竞买人应具备资格条件
+竞价人资格条件
+竞标人资格条件
+竞标需具备的资格条件
+遴选申请人的资格条件
+项目经理必须具备的最低资格等级条件
+资质资格要求
+供应商资质要求
+申请人资格要求
+申请人的条件
+供应商报名要求
+供应商的资格要求
+招标条件
+供应商资格条件要求
+投标单位资格要求
+供应商资格要求
+谈判报名资格要求
+投标人的资格条件
+投标人资格要求
+招标人资格要求
+采购项目分包情况
+投标人的资格要求包括
+对投标人的资格要求
+谈判申请人资格要求
+要求

+ 1 - 0
src/res/blocktagdb/资金来源.txt

@@ -0,0 +1 @@
+资金来源

+ 11 - 0
src/res/blocktagdb/采购单位.txt

@@ -0,0 +1,11 @@
+采购单位
+采购单位名称
+采购单位的名称
+采购单位信息
+采购机构名称
+集中采购机构
+政府采购中心信息
+成交确认
+采购人
+采购人名称
+采购人信息

+ 11 - 0
src/res/blocktagdb/采购单位地址.txt

@@ -0,0 +1,11 @@
+采购单位地址
+采购人地址
+采购人名称
+采购单位名称
+采购单位信息
+政府采购中心信息
+本次采购联系事项
+本次招标联系事项
+采购人信息
+联系事项
+联系地址

+ 13 - 0
src/res/blocktagdb/采购单位联系人.txt

@@ -0,0 +1,13 @@
+采购单位联系人
+采购人联系人
+采购人
+政府采购中心信息
+本次采购联系事项
+本次招标联系事项
+联系人及联系方式
+采购人信息
+采购联系人
+联系事项
+联系方式
+联系人
+联系方式如下

+ 14 - 0
src/res/blocktagdb/采购单位联系电话.txt

@@ -0,0 +1,14 @@
+采购单位联系人电话
+采购单位信息
+采购人
+采购人联系电话
+政府采购中心信息
+本次采购联系事项
+本次招标联系事项
+联系人及联系方式
+采购人信息
+联系事项
+联系方式
+电话
+联系方式如下
+采购人联系方式

+ 103 - 0
src/res/blocktagdb/项目名称.txt

@@ -0,0 +1,103 @@
+项目名称
+招标项目名称
+采购项目名称
+竞标项目名称
+磋商项目名称
+政府采购项目名称
+询价项目名称
+谈判项目名称
+项目名称编号
+主要采购项目的名称
+公开招标项目名称
+原公告采购项目名称
+原公告项目名称
+原项目名称
+招商项目名称
+招标项目的名称
+拟单一来源采购项目名称
+拟提供采购项目的供应商名称
+谈判招标项目名称
+采购采购项目名称
+项目名称采购项目名称
+采购项目的名称
+采购名称
+分包名称
+合同名称
+工程名称
+征集项目名称
+竞争性谈判项目名称
+采购项目名称项目编号
+名称
+基本情况
+工程概况
+建设工程概况
+公告内容
+公告情况
+招标基本情况
+招标工程概况
+招标工程项目概况
+招标概况
+招标项目基本情况
+招标项目情况
+招标项目概况
+标的基本情况
+原招标项目简介
+工程项目情况
+工程项目概况如下
+招标项目的概况
+招标项目简介
+拟提供货物或服务项目基本情况
+拟采购货物或服务项目基本情况
+本标段项目概况
+本次招标工程项目的概况
+本次招标工程项目的概况如下
+本次招标的工程项目情况
+本次招标的工程项目情况为
+本次招标项目的概况如下
+谈判项目简介
+采购内容或项目基本概况介绍
+采购项目内容情况
+采购项目基本信息
+采购项目情况说明
+采购项目的项目概况简要描述
+概况
+比选项目概况
+竞争性磋商项目概况
+竞价公告信息
+竞价项目概况
+网上竞价采购信息
+网上询价采购信息
+询价采购项目概况如下
+谈判项目内容
+采购信息
+采购内容
+采购工程概况
+采购概况
+采购项目
+采购项目信息
+采购项目分包情况
+采购项目基本情况
+采购项目基本概况
+采购项目基本概况介绍
+采购项目情况
+采购项目概况
+采购项目概况介绍
+采购项目的基本概况
+项目信息
+项目内容
+项目名称变更为
+项目基本信息
+项目基本情况
+项目基本概况介绍
+项目情况
+项目情况说明
+项目有关情况
+项目概况
+项目概况招标范围
+项目的概况
+项目相关情况
+项目简介
+项目简要情况
+项目采购内容
+预购单公告信息
+询价书名称

+ 1 - 0
src/res/blocktagdb/项目类型.txt

@@ -0,0 +1 @@
+本项目的项目类别

+ 128 - 0
src/res/blocktagdb/项目编号.txt

@@ -0,0 +1,128 @@
+谈判项目名称及编号
+项目名称及编号
+采购项目编号
+采购项目项目编号
+招标项目编号
+项目编号
+询价项目编号
+采购代理机构项目编号
+政府采购编号
+政府采购计划编号
+政府采购项目编号
+采购编号
+计划编号
+询价函编号
+询价采购文件编号
+询价采购编号
+采购招标编号
+采购文件编号
+采购项目名称编号
+采购项目名称项目编号
+项目预公示编号
+项目编号包组号
+项目名称编号
+采购项目计划编号
+采购项目招标编号
+采购项目文件编号
+采购项目标书编号
+采购项目编号合同编号
+交易编号
+委托编号
+招标编号
+公示编号
+单一来源编号
+合同编号
+委托代理编号
+委托文件编号
+招标文书编号
+招标文件编号
+批准文件编号
+审批编号
+比选编号
+投资编号
+洽谈编号
+电子反拍编号
+磋商文件编号
+磋商编号
+磋商项目编号
+招标书编号
+招标公告编号
+招标合同编号
+标书编号
+谈判文件编号
+谈判编号
+财政批准编号
+采购代理编号
+竞争性磋商文件编号
+竞争性谈判文件编号
+竞标编号
+编号
+工程概况
+建设工程概况
+招标基本情况
+招标工程概况
+招标工程项目概况
+公告内容
+公告情况
+招标概况
+招标项目基本情况
+招标项目情况
+招标项目概况
+标的基本情况
+原招标项目简介
+工程项目情况
+工程项目概况如下
+招标项目的概况
+招标项目简介
+拟提供货物或服务项目基本情况
+拟采购货物或服务项目基本情况
+本标段项目概况
+本次招标工程项目的概况
+本次招标工程项目的概况如下
+本次招标的工程项目情况
+本次招标的工程项目情况为
+本次招标项目的概况如下
+谈判项目简介
+采购内容或项目基本概况介绍
+采购项目内容情况
+采购项目基本信息
+采购项目情况说明
+采购项目的项目概况简要描述
+概况
+比选项目概况
+竞争性磋商项目概况
+竞价公告信息
+竞价项目概况
+网上竞价采购信息
+网上询价采购信息
+询价采购项目概况如下
+采购信息
+采购工程概况
+采购概况
+采购项目
+采购项目信息
+采购项目基本情况
+采购项目基本概况
+采购项目基本概况介绍
+采购项目情况
+采购项目概况
+采购项目概况介绍
+采购项目的基本概况
+项目信息
+项目内容
+项目号
+项目基本信息
+项目基本情况
+项目基本概况介绍
+项目序列号
+项目情况
+项目情况说明
+项目批准书编号
+项目有关情况
+项目概况
+项目的概况
+项目概况招标范围
+项目相关情况
+项目采购内容
+项目简要情况
+预购单公告信息

+ 33 - 0
src/res/blocktagdb/项目范围.txt

@@ -0,0 +1,33 @@
+采购项目范围
+采购范围
+招标范围
+采购内容
+范围
+项目概述
+项目内容
+项目工作内容
+项目建设内容
+项目概况及招标范围
+项目目标和范围
+项目范围
+项目采购范围
+工程概况与招标范围工期
+工程招标范围
+招标内容
+招标范围及内容
+招标项目内容
+拟采购货物说明
+本项目招标范围
+本项目采购范围
+采购内容及数量
+采购内容及要求
+采购内容简介
+采购范围包括
+采购项目内容
+项目内容及需求
+项目实施内容
+项目概况与招标范围
+项目概况与招标范围质量
+谈判范围
+改造工程招标范围
+招标范围招标范围

+ 108 - 0
src/res/blocktagdb/预算.txt

@@ -0,0 +1,108 @@
+项目预算
+采购预算
+本项目预算
+预算
+预算金额
+采购项目预算金额
+本项目采购预算金额
+本项目的控制预算
+批准预算
+原招标公告预算金额
+工程招标控制价
+投资估算
+招标控制价
+招标控制价为
+招标控制价总价
+招标预算
+拟采购项目预算金额
+政府采购预算金额
+最高采购预算
+本项目上限控制价为
+本项目原招标控制价
+本项目招标控制价修改为
+本项目概算投资金额为
+本项目的投资额
+本项目采购预算
+本项目采购预算为
+本项目预算价为
+本项目预算审核价
+本项目预算金额
+该项目采购预算金额
+采购项目预算
+采购项目预算总金额
+采购预算价
+采购预算金额
+项目估算价
+项目估算金额
+项目概算
+项目采购预算
+项目预算价
+项目预算单价
+项目预算金额
+预算价
+预算审核价
+预算总金额
+预算控制价
+预算资金
+预算采购金额
+项目金额
+采购内容预算
+采购内容数量预算
+招标基本情况
+招标工程概况
+招标工程项目概况
+招标概况
+招标项目基本情况
+本项目资金情况
+标的基本情况
+原招标项目简介
+工程项目情况
+工程项目概况如下
+招标项目的概况
+招标项目简介
+拟提供货物或服务项目基本情况
+拟采购货物或服务项目基本情况
+本标段项目概况
+本次招标工程项目的概况
+本次招标工程项目的概况如下
+本次招标的工程项目情况
+本次招标的工程项目情况为
+本次招标项目的概况如下
+谈判项目简介
+采购内容或项目基本概况介绍
+采购项目内容情况
+采购项目基本信息
+采购项目情况说明
+采购项目的项目概况简要描述
+内容
+概况
+竞争性磋商项目概况
+竞价项目概况
+网上竞价采购信息
+网上询价采购信息
+询价采购项目概况如下
+采用单一来源采购方式的理由
+采购信息
+采购工程概况
+采购情况
+采购概况
+采购金额
+采购项目信息
+采购项目名称项目编号
+采购项目基本情况
+采购项目基本概况
+采购项目基本概况介绍
+采购项目概况
+采购项目概况介绍
+采购项目的基本概况
+项目信息
+项目内容
+项目基本概况介绍
+项目情况
+项目情况说明
+项目概况
+项目概况招标范围
+项目相关情况
+项目简要情况
+项目简要说明
+项目采购内容