wcc 3 mesiacov pred
rodič
commit
e30b6ca462

+ 10 - 10
bidding_test/main.go

@@ -26,20 +26,20 @@ func InitMgo() {
 	//	//MongodbAddr: "127.0.0.1:27083",
 	//	Size:     10,
 	//	DbName:   "qfw",
-	//	UserName: "SJZY_RWbid_ES",
+	//	UserName: "SJZY_RWbid_ES",a
 	//	Password: "SJZY@B4i4D5e6S",
 	//	//Direct:      true,
 	//}
 	//MgoB.InitPool()
 
 	MgoQy = &mongodb.MongodbSim{
-		//MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
-		MongodbAddr: "127.0.0.1:27083",
-		Size:        10,
-		DbName:      "mixdata",
-		UserName:    "SJZY_RWbid_ES",
-		Password:    "SJZY@B4i4D5e6S",
-		Direct:      true,
+		MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
+		//MongodbAddr: "127.0.0.1:27083",
+		Size:     10,
+		DbName:   "mixdata",
+		UserName: "SJZY_RWbid_ES",
+		Password: "SJZY@B4i4D5e6S",
+		//Direct:      true,
 	}
 	MgoQy.InitPool()
 
@@ -80,8 +80,8 @@ func InitMgo() {
 
 func InitEs() {
 	Es = &es.Elastic{
-		S_esurl: "http://127.0.0.1:19908",
-		//S_esurl:  "http://172.17.4.184:19908",
+		//S_esurl: "http://127.0.0.1:19908",
+		S_esurl:  "http://172.17.4.184:19908",
 		I_size:   5,
 		Username: "jybid",
 		Password: "Top2023_JEB01i@31",

+ 30 - 15
bidding_test/qyxy.go

@@ -11,15 +11,13 @@ import (
 	"log"
 )
 
-// fixQyxy 修复企业数据
 func fixQyxy() {
-	//c查询use_flag=10的 qyxy 数据,然后去
-	//url := "http://172.17.4.184:19908"
-	url := "http://127.0.0.1:19908"
+	// 连接 ES
+	url := "http://172.17.4.184:19908"
+	//url := "http://127.0.0.1:19908"
 	username := "jybid"
 	password := "Top2023_JEB01i@31"
-	//index := "bidding" //索引名称
-	// 创建 Elasticsearch 客户端
+
 	client, err := elastic.NewClient(
 		elastic.SetURL(url),
 		elastic.SetBasicAuth(username, password),
@@ -29,13 +27,13 @@ func fixQyxy() {
 		log.Fatalf("创建 Elasticsearch 客户端失败:%s", err)
 	}
 
-	//
 	sess := MgoQy.GetMgoConn()
 	defer MgoQy.DestoryMongoConn(sess)
+
 	where := map[string]interface{}{
 		"use_flag": 10,
 	}
-	queryMgo := sess.DB("mixdata").C("qyxy_std").Find(where).Select(nil).Limit(2).Iter()
+	queryMgo := sess.DB("mixdata").C("qyxy_std").Find(where).Select(nil).Iter()
 	count := 0
 	for tmp := make(map[string]interface{}); queryMgo.Next(tmp); count++ {
 		if count%1000 == 0 {
@@ -43,7 +41,7 @@ func fixQyxy() {
 		}
 		id := util.ObjToString(tmp["_id"])
 		company_name := util.ObjToString(tmp["company_name"])
-		if company_name == "无" || company_name == "|" {
+		if company_name == "无" || company_name == "|" || company_name == "" {
 			continue
 		}
 		where2 := map[string]interface{}{
@@ -79,11 +77,11 @@ func fixQyxy() {
 
 		if err != nil {
 			if err == io.EOF {
-				fmt.Println("没有数据")
+				log.Println("没有数据")
 			} else {
-				panic(err)
+				log.Println(err)
+				continue
 			}
-
 		}
 		//defer client.ClearScroll().ScrollId(scrollID).Do(ctx) // 在退出时清理资源
 		fmt.Println("总数是:", res.TotalHits())
@@ -120,6 +118,10 @@ func fixQyxy() {
 						{"_id": esID},
 						esUpdate,
 					}
+					log.Println("aaaaaaaa", esID, esUpdate)
+					//更新项目MongoDB
+					MgoP.UpdateById("projectset_20230904", esID, map[string]interface{}{"$set": esUpdate})
+
 				}
 			}
 
@@ -142,14 +144,27 @@ func fixQyxy() {
 			"_id": id,
 		}
 		MgoQy.Delete("qyxy_std", whereDel)
-		MgoQy.Save("wcc_qyxy_std_delete", tmp)
-		// 在循环外调用 ClearScroll
+		MgoQy.SaveByOriID("wcc_qyxy_std_delete", tmp)
+		//在循环外调用 ClearScroll
 		_, err = client.ClearScroll().ScrollId(scrollID).Do(ctx)
 		if err != nil {
 			log.Printf("清理滚动搜索失败:%s", err)
 		}
-	}
 
+		_, err = client.Scroll().ScrollId(scrollID).Scroll("2m").Do(ctx)
+		if err != nil {
+			if elasticErr, ok := err.(*elastic.Error); ok && elasticErr.Status == 400 {
+				log.Println("滚动查询失败,可能是 Scroll ID 失效,直接退出")
+				return
+			}
+			log.Println("滚动查询失败:", err)
+		}
+
+		_, err = client.ClearScroll().ScrollId(scrollID).Do(ctx)
+		if err != nil {
+			log.Printf("清理滚动搜索失败:%s", err)
+		}
+	}
 	log.Println("数据处理完毕")
 }
 

BIN
getEs/getEs0321 → es_test/es-test


+ 98 - 0
es_test/es.go

@@ -0,0 +1,98 @@
+package main
+
+//
+//import (
+//	"app.yhyue.com/moapp/jybase/common"
+//	elastic "app.yhyue.com/moapp/jybase/es"
+//	"fmt"
+//	es "github.com/olivere/elastic/v7"
+//	"log"
+//	"sync"
+//)
+//
+//
+//func task() {
+//	log.Println("开始任务  ")
+//	Es = elastic.NewEs("07", "http://172.17.4.184:19908", 50, "jybid", "Top2023_JEB01i@31")
+//	// ff := newxlsx.NewFile()
+//	// sh1, _ := ff.AddSheet("1")
+//	wg := &sync.WaitGroup{}
+//	ch := make(chan bool, 1)
+//	// winnerMap := map[string]string{}
+//	esCon := Es.(*elastic.EsV7)
+//	client := esCon.GetEsConn()
+//	defer esCon.DestoryEsConn(client)
+//	cc := &MySource{
+//		Querys: `{
+//  "query": {
+//    "bool": {
+//      "must": [
+//        {
+//          "term": {
+//            "buyer": "大唐国际发电股份有限公司本部"
+//          }
+//        }
+//      ]
+//    }
+//  }
+//}`,
+//	}
+//	escount := Es.Count("bidding", "", cc.Querys)
+//	log.Println(escount)
+//	// idMap := map[string]string{}
+//	ctx, _ := context.WithTimeout(context.Background(), 30*time.Hour)
+//	res, err := client.Scroll("bidding").Query(cc).Size(2000).Do(ctx) //查询一条获取游标
+//	if err == nil {
+//		numDocs := 0
+//		scrollId := res.ScrollId
+//		count := 1
+//		for {
+//			if scrollId == "" {
+//				log.Println("ScrollId Is Error")
+//				break
+//			}
+//			var searchResult *es.SearchResult
+//			var err error
+//			if count == 1 {
+//				searchResult = res
+//			} else {
+//				searchResult, err = client.Scroll("bidding").Size(2000).ScrollId(scrollId).Do(ctx) //查询
+//				if err != nil {
+//					if err.Error() == "EOS" { //迭代完毕
+//						log.Println("Es Search Data Over:", err)
+//					} else {
+//						log.Println("Es Search Data Error:", err)
+//					}
+//					break
+//				}
+//			}
+//			log.Println(fmt.Sprintf("此次处理条数: %d", len(searchResult.Hits.Hits)))
+//			for _, hit := range searchResult.Hits.Hits {
+//				//开始处理数据
+//				wg.Add(1)
+//				ch <- true
+//				go func(tmpHit *es.SearchHit) {
+//					defer func() {
+//						<-ch
+//						wg.Done()
+//					}()
+//					tmp := make(map[string]interface{})
+//					if json.Unmarshal(tmpHit.Source, &tmp) == nil {
+//						id := common.ObjToString(tmp["id"])
+//						data := Bidding.FindById("bidding", id)
+//						Bidding.Save("xzh_1217_2", data)
+//					}
+//				}(hit)
+//				numDocs += 1
+//				if numDocs%500 == 0 {
+//					log.Println("numDocs", numDocs)
+//				}
+//			}
+//			scrollId = searchResult.ScrollId
+//			count++
+//		}
+//		wg.Wait()
+//		client.ClearScroll().ScrollId(scrollId).Do(ctx) //清理游标
+//	}
+//
+//}

+ 332 - 0
es_test/go-elastic.go

@@ -0,0 +1,332 @@
+package main
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"github.com/elastic/go-elasticsearch/v7"
+	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
+	"log"
+	"time"
+)
+
+func fixQyxy() {
+	// 连接 Elasticsearch
+	cfg := elasticsearch.Config{
+		//Addresses: []string{"http://127.0.0.1:19908"}, // 或者 "http://172.17.4.184:19908"
+		Addresses: []string{"http://172.17.4.184:19908"}, // 或者 "http://172.17.4.184:19908"
+		Username:  "jybid",
+		Password:  "Top2023_JEB01i@31",
+	}
+	es, err := elasticsearch.NewClient(cfg)
+	if err != nil {
+		log.Fatalf("创建 Elasticsearch 客户端失败: %s", err)
+	}
+
+	// 连接 MongoDB
+	sess := MgoQy.GetMgoConn()
+	defer MgoQy.DestoryMongoConn(sess)
+
+	// 查询 MongoDB 需要处理的企业
+	where := map[string]interface{}{"use_flag": 10}
+	queryMgo := sess.DB("mixdata").C("qyxy_std").Find(where).Select(nil).Iter()
+	count := 0
+
+	// 遍历 MongoDB 结果
+	for tmp := make(map[string]interface{}); queryMgo.Next(tmp); count++ {
+		if count%100 == 0 {
+			log.Println("current:", count, tmp["_id"])
+		}
+
+		id := util.ObjToString(tmp["_id"])
+		// **删除 MongoDB 数据**
+		whereDel := map[string]interface{}{"_id": tmp["_id"]}
+		MgoQy.Delete("qyxy_std", whereDel)
+		MgoQy.SaveByOriID("wcc_qyxy_std_delete", tmp)
+
+		company_name := util.ObjToString(tmp["company_name"])
+		if company_name == "无" || company_name == "|" || company_name == "" {
+			continue
+		}
+
+		// 查询企业是否已经存在
+		where2 := map[string]interface{}{
+			"company_name": company_name,
+			"use_flag":     0,
+		}
+		std, _ := MgoQy.FindOne("qyxy_std", where2)
+		var newID string
+		if len(*std) > 0 {
+			newID = util.ObjToString((*std)["_id"])
+		}
+
+		// **构造查询 JSON**
+		query := map[string]interface{}{
+			"query": map[string]interface{}{
+				"bool": map[string]interface{}{
+					"must": []map[string]interface{}{
+						{"term": map[string]interface{}{"entidlist": id}},
+					},
+				},
+			},
+		}
+
+		queryBody, _ := json.Marshal(query)
+		ctx := context.Background()
+		res, err := es.Search(
+			es.Search.WithContext(ctx),
+			es.Search.WithIndex("projectset"),
+			es.Search.WithTrackTotalHits(true),
+			es.Search.WithPretty(),
+			es.Search.WithBody(bytes.NewReader(queryBody)),
+		)
+		if err != nil {
+			log.Println("ES 查询失败:", err)
+			continue
+		}
+		defer res.Body.Close()
+		// **解析初始查询结果**
+		var esRes map[string]interface{}
+		if err := json.NewDecoder(res.Body).Decode(&esRes); err != nil {
+			log.Println("解析查询结果失败:", err)
+			continue
+		}
+
+		// 解析查询结果
+		hits, ok := esRes["hits"].(map[string]interface{})["hits"].([]interface{})
+		if !ok || len(hits) == 0 {
+			continue
+		}
+
+		//log.Println("bbbbbb", len(hits), id, newID)
+
+		for _, hit := range hits {
+			doc, _ := hit.(map[string]interface{})["_source"].(map[string]interface{})
+			esID := util.ObjToString(doc["id"])
+			newEntidlist := make([]string, 0)
+			//存入新表
+			if entidlist, ok := doc["entidlist"].([]interface{}); ok && len(entidlist) > 0 {
+				for _, v := range entidlist {
+					list_id := util.ObjToString(v)
+					if list_id != id && list_id != "-" {
+						newEntidlist = append(newEntidlist, list_id)
+					}
+				}
+
+				if newID != "" {
+					newEntidlist = append(newEntidlist, newID)
+				}
+				//更新es
+				esUpdate := map[string]interface{}{
+					"entidlist": newEntidlist,
+				}
+				// 更新Es 数据
+				updateEsPool <- []map[string]interface{}{
+					{"_id": esID},
+					esUpdate,
+				}
+				log.Println("aaaaaaaa", esID, newEntidlist)
+				////更新项目MongoDB
+				MgoP.UpdateById("projectset_20230904", esID, map[string]interface{}{"$set": esUpdate})
+			}
+		}
+
+	}
+	log.Println("数据处理完毕")
+}
+
+func fixQyxy2() {
+	// 连接 Elasticsearch
+	cfg := elasticsearch.Config{
+		//Addresses: []string{"http://172.17.4.184:19908"},
+		Addresses: []string{"http://127.0.0.1:19908"},
+		Username:  "jybid",
+		Password:  "Top2023_JEB01i@31",
+	}
+	es, err := elasticsearch.NewClient(cfg)
+	if err != nil {
+		log.Fatalf("创建 Elasticsearch 客户端失败: %s", err)
+	}
+
+	// 连接 MongoDB
+	sess := MgoQy.GetMgoConn()
+	defer MgoQy.DestoryMongoConn(sess)
+
+	// 查询 MongoDB 需要处理的企业
+	where := map[string]interface{}{"use_flag": 10}
+	queryMgo := sess.DB("mixdata").C("qyxy_std").Find(where).Select(nil).Iter()
+	count := 0
+
+	// 遍历 MongoDB 结果
+	for tmp := make(map[string]interface{}); queryMgo.Next(tmp); count++ {
+		if count%100 == 0 {
+			log.Println("current:", count, tmp["_id"])
+		}
+
+		id := util.ObjToString(tmp["_id"])
+		company_name := util.ObjToString(tmp["company_name"])
+		if company_name == "无" || company_name == "|" || company_name == "" {
+			continue
+		}
+
+		// 查询企业是否已经存在
+		where2 := map[string]interface{}{
+			"company_name": company_name,
+			"use_flag":     0,
+		}
+		std, _ := MgoQy.FindOne("qyxy_std", where2)
+		var newID string
+		if len(*std) > 0 {
+			newID = id
+		}
+
+		// **构造查询 JSON**
+		query := map[string]interface{}{
+			"query": map[string]interface{}{
+				"bool": map[string]interface{}{
+					"must": []map[string]interface{}{
+						{"term": map[string]interface{}{"entidlist": id}},
+					},
+				},
+			},
+			"size": 500,
+			"sort": []map[string]interface{}{
+				{"_doc": map[string]string{"order": "asc"}},
+			},
+		}
+
+		queryBody, _ := json.Marshal(query)
+
+		// **初始化滚动查询**
+		ctx := context.Background()
+		//scrollTime := "2m"
+		scrollTime, _ := time.ParseDuration("2m")
+		res, err := es.Search(
+			es.Search.WithContext(ctx),
+			es.Search.WithIndex("projectset"),
+			es.Search.WithBody(bytes.NewReader(queryBody)),
+			es.Search.WithScroll(scrollTime),
+		)
+		if err != nil {
+			log.Println("ES 查询失败:", err)
+			continue
+		}
+		defer res.Body.Close()
+
+		// **解析初始查询结果**
+		var esRes map[string]interface{}
+		if err := json.NewDecoder(res.Body).Decode(&esRes); err != nil {
+			log.Println("解析查询结果失败:", err)
+			continue
+		}
+
+		scrollID, _ := esRes["_scroll_id"].(string)
+		if scrollID == "" {
+			log.Println("获取 Scroll ID 失败")
+			continue
+		}
+
+		total := 0
+		for {
+			// 解析查询结果
+			hits, ok := esRes["hits"].(map[string]interface{})["hits"].([]interface{})
+			if !ok || len(hits) == 0 {
+				break
+			}
+
+			// **批量更新 ES**
+			//bulkUpdate := make([]byte, 0)
+			for _, hit := range hits {
+				doc, _ := hit.(map[string]interface{})["_source"].(map[string]interface{})
+				//esID := util.ObjToString(doc["id"])
+				newEntidlist := make([]string, 0)
+
+				if entidlist, ok := doc["entidlist"].([]interface{}); ok {
+					for _, v := range entidlist {
+						list_id := util.ObjToString(v)
+						if list_id != id && list_id != "-" {
+							newEntidlist = append(newEntidlist, list_id)
+						}
+					}
+				}
+				if newID != "" {
+					newEntidlist = append(newEntidlist, newID)
+				}
+
+				// 构造 Bulk Update 请求
+				//updateData := map[string]interface{}{
+				//	"update": map[string]string{"_id": esID},
+				//}
+				//updateBody := map[string]interface{}{
+				//	"doc": map[string]interface{}{"entidlist": newEntidlist},
+				//}
+				//updateDataJSON, _ := json.Marshal(updateData)
+				//updateBodyJSON, _ := json.Marshal(updateBody)
+				//
+				//bulkUpdate = append(bulkUpdate, append(updateDataJSON, '\n')...)
+				//bulkUpdate = append(bulkUpdate, append(updateBodyJSON, '\n')...)
+			}
+
+			// 发送批量更新请求
+			//if len(bulkUpdate) > 0 {
+			//	res, err := es.Bulk(bytes.NewReader(bulkUpdate), es.Bulk.WithContext(ctx), es.Bulk.WithIndex("projectset"))
+			//	if err != nil {
+			//		log.Println("批量更新 ES 失败:", err)
+			//	} else {
+			//		defer res.Body.Close()
+			//		log.Println("批量更新 ES 成功")
+			//	}
+			//}
+
+			total += len(hits)
+
+			// **继续滚动查询**
+			scrollReq := map[string]interface{}{
+				"scroll":    scrollTime,
+				"scroll_id": scrollID,
+			}
+			scrollBody, _ := json.Marshal(scrollReq)
+
+			res, err = es.Scroll(es.Scroll.WithContext(ctx), es.Scroll.WithBody(bytes.NewReader(scrollBody)))
+			if err != nil {
+				log.Println("滚动查询失败:", err)
+				break
+			}
+			defer res.Body.Close()
+
+			// **解析滚动查询响应**
+			if err := json.NewDecoder(res.Body).Decode(&esRes); err != nil {
+				log.Println("解析滚动查询响应失败:", err)
+				break
+			}
+
+			scrollID, _ = esRes["_scroll_id"].(string)
+			if scrollID == "" {
+				log.Println("滚动查询结束")
+				break
+			}
+
+			log.Println("当前已更新:", total)
+		}
+
+		// **删除 MongoDB 数据**
+		//whereDel := map[string]interface{}{"_id": id}
+		//MgoQy.Delete("qyxy_std", whereDel)
+		//MgoQy.SaveByOriID("wcc_qyxy_std_delete", tmp)
+
+		// **清理滚动查询**
+		if scrollID != "" {
+			clearReq := map[string]interface{}{"scroll_id": []string{scrollID}}
+			clearBody, _ := json.Marshal(clearReq)
+
+			res, err := es.ClearScroll(es.ClearScroll.WithBody(bytes.NewReader(clearBody)))
+			if err != nil {
+				log.Println("清理滚动搜索失败:", err)
+			} else {
+				defer res.Body.Close()
+				//log.Println("滚动查询清理成功")
+			}
+		}
+	}
+	log.Println("数据处理完毕")
+}

+ 31 - 0
es_test/go.mod

@@ -0,0 +1,31 @@
+module es_test
+
+go 1.23.7
+
+require (
+	github.com/elastic/go-elasticsearch/v7 v7.17.10
+	jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240412074219-927f3f682cb3
+)
+
+require (
+	github.com/PuerkitoBio/goquery v1.8.0 // indirect
+	github.com/andybalholm/cascadia v1.3.1 // indirect
+	github.com/dchest/captcha v1.0.0 // indirect
+	github.com/golang/snappy v0.0.1 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/klauspost/compress v1.13.6 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
+	github.com/olivere/elastic/v7 v7.0.32 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
+	github.com/xdg-go/scram v1.1.1 // indirect
+	github.com/xdg-go/stringprep v1.0.3 // indirect
+	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
+	go.mongodb.org/mongo-driver v1.10.1 // indirect
+	golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
+	golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
+	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
+	golang.org/x/text v0.3.7 // indirect
+	gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect
+)

+ 200 - 0
es_test/go.sum

@@ -0,0 +1,200 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
+github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
+github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
+github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
+github.com/aws/aws-sdk-go v1.43.21/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o=
+github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo=
+github.com/elastic/go-elasticsearch/v7 v7.17.10 h1:TCQ8i4PmIJuBunvBS6bwT2ybzVFxxUhhltAs3Gyu1yo=
+github.com/elastic/go-elasticsearch/v7 v7.17.10/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
+github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
+github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
+github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
+github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E=
+github.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
+github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
+github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
+github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
+github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
+github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
+github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs=
+github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+go.mongodb.org/mongo-driver v1.10.1 h1:NujsPveKwHaWuKUer/ceo9DzEe7HIj1SlJ6uvXZG0S4=
+go.mongodb.org/mongo-driver v1.10.1/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opentelemetry.io/otel v1.5.0/go.mod h1:Jm/m+rNp/z0eqJc74H7LPwQ3G87qkU/AnnAydAjSAHk=
+go.opentelemetry.io/otel/trace v1.5.0/go.mod h1:sq55kfhjXYr1zVSyexg0w1mpa03AYXR5eyTkB9NPPdE=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240412074219-927f3f682cb3 h1:mTokQIoOu/oZ2oCSAPayIFfnglIHP0qbOw1Ez6biKDo=
+jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240412074219-927f3f682cb3/go.mod h1:1Rp0ioZBhikjXHYYXmnzL6RNfvTDM/2XvRB+vuPLurI=

+ 133 - 0
es_test/main.go

@@ -0,0 +1,133 @@
+package main
+
+import (
+	es "jygit.jydev.jianyu360.cn/data_processing/common_utils/elastic"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+	"log"
+	"time"
+)
+
+var (
+	MgoB         *mongodb.MongodbSim
+	MgoQy        *mongodb.MongodbSim
+	MgoP         *mongodb.MongodbSim
+	Es           *es.Elastic
+	updatePool   = make(chan []map[string]interface{}, 5000)
+	updateEsPool = make(chan []map[string]interface{}, 5000)
+	updateEsSp   = make(chan bool, 5) //保存协程
+)
+
+func InitMgo() {
+	//MgoB = &mongodb.MongodbSim{
+	//	MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
+	//	//MongodbAddr: "127.0.0.1:27083",
+	//	Size:     10,
+	//	DbName:   "qfw",
+	//	UserName: "SJZY_RWbid_ES",a
+	//	Password: "SJZY@B4i4D5e6S",
+	//	//Direct:      true,
+	//}
+	//MgoB.InitPool()
+
+	MgoQy = &mongodb.MongodbSim{
+		MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
+		//MongodbAddr: "127.0.0.1:27083",
+		Size:     10,
+		DbName:   "mixdata",
+		UserName: "SJZY_RWbid_ES",
+		Password: "SJZY@B4i4D5e6S",
+		//Direct:      true,
+	}
+	MgoQy.InitPool()
+
+	MgoP = &mongodb.MongodbSim{
+		//MongodbAddr: "127.0.0.1:27080",
+		MongodbAddr: "172.17.4.85:27080",
+		DbName:      "qfw",
+		Size:        10,
+		//Direct: true,
+	}
+	MgoP.InitPool()
+
+	// 本地数据库
+	//MgoB = &mongodb.MongodbSim{
+	//	//MongodbAddr: "172.17.189.140:27080",
+	//	MongodbAddr: "127.0.0.1:27017",
+	//	Size:        10,
+	//	DbName:      "wcc",
+	//	//UserName:    "SJZY_RWbid_ES",
+	//	//Password:    "SJZY@B4i4D5e6S",
+	//	//Direct:      true,
+	//}
+	//MgoB.InitPool()
+
+	// 测试环境
+	//MgoB = &mongodb.MongodbSim{
+	//	MongodbAddr: "192.168.3.206:27002",
+	//	//MongodbAddr: "127.0.0.1:27017",
+	//	Size:     10,
+	//	DbName:   "qfw_data",
+	//	UserName: "root",
+	//	Password: "root",
+	//	//Direct:      true,
+	//}
+	//MgoB.InitPool()
+
+}
+
+func InitEs() {
+	Es = &es.Elastic{
+		//S_esurl: "http://127.0.0.1:19908",
+		S_esurl:  "http://172.17.4.184:19908",
+		I_size:   5,
+		Username: "jybid",
+		Password: "Top2023_JEB01i@31",
+	}
+	Es.InitElasticSize()
+}
+
+func main() {
+	InitMgo()
+	InitEs()
+
+	go updateEsMethod()
+	fixQyxy()
+	log.Println("11111111111")
+	select {}
+}
+
+// updateEsMethod 更新es
+func updateEsMethod() {
+	arru := make([][]map[string]interface{}, 200)
+	indexu := 0
+	for {
+		select {
+		case v := <-updateEsPool:
+			arru[indexu] = v
+			indexu++
+			if indexu == 200 {
+				updateEsSp <- true
+				go func(arru [][]map[string]interface{}) {
+					defer func() {
+						<-updateEsSp
+					}()
+					Es.UpdateBulk("projectset", arru...)
+				}(arru)
+				arru = make([][]map[string]interface{}, 200)
+				indexu = 0
+			}
+		case <-time.After(1000 * time.Millisecond):
+			if indexu > 0 {
+				updateEsSp <- true
+				go func(arru [][]map[string]interface{}) {
+					defer func() {
+						<-updateEsSp
+					}()
+					Es.UpdateBulk("projectset", arru...)
+				}(arru[:indexu])
+				arru = make([][]map[string]interface{}, 200)
+				indexu = 0
+			}
+		}
+	}
+}

BIN
getEs/202502项目3_人工验证版.xlsx


+ 24 - 18
getEs/bidding.go

@@ -499,15 +499,15 @@ func getDataFromFile() {
 		if len(results) > 0 {
 			startCol := 8 // C列对应索引3 := 3 // C 列开始
 			for _, result := range results {
-				//f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", getColumnLetter(startCol), i+1), result["bidamount"]) // 中标金额
-				f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", getColumnLetter(startCol), i+1), result["budget"]) // 中标金额
+				f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", getColumnLetter(startCol), i+1), result["bidamount"]) // 中标金额
+				//f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", getColumnLetter(startCol), i+1), result["budget"]) // 预算金额
 				//f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", getColumnLetter(startCol), i+1), result["total_investment"]) // 预算金额
 				f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", getColumnLetter(startCol+1), i+1), result["title"])  // 标题
 				f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", getColumnLetter(startCol+2), i+1), result["jyhref"]) // 标讯链接
 				f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", getColumnLetter(startCol+3), i+1), result["score"])  // 相似度
 				startCol += 4                                                                                     // **向右移动 4 列,防止数据覆盖**
 			}
-			f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", "G", i+1), "拟建") // 相似度
+			f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", "G", i+1), "结果") // 相似度
 
 		}
 	}
@@ -518,13 +518,13 @@ func getDataFromFile() {
 func searchES(client *elastic.Client, projectName, buyer2 string) ([]map[string]interface{}, error) {
 	query := elastic.NewBoolQuery().
 		Must(
-			elastic.NewMatchQuery("projectname.pname", projectName), // 模糊匹配 projectname
-			//elastic.NewMatchQuery("title", projectName), // 模糊匹配 projectname
+			//elastic.NewMatchQuery("projectname.pname", projectName), // 模糊匹配 projectname
+			elastic.NewMatchQuery("title", projectName), // 模糊匹配 projectname
 			//elastic.NewMatchQuery("detail", projectName), // 模糊匹配 projectname
-			elastic.NewTermQuery("area", "安徽"), // 过滤区域
-			//elastic.NewTermsQuery("subtype", "中标", "成交", "合同", "单一"), // 过滤 subtype
+			elastic.NewTermQuery("area", "安徽"),                       // 过滤区域
+			elastic.NewTermsQuery("subtype", "中标", "成交", "合同", "单一"), // 过滤 subtype
 			//elastic.NewTermsQuery("toptype", "招标", "预告", "采购意向"), // 过滤 subtype
-			elastic.NewTermsQuery("toptype", "拟建"), // 过滤 subtype
+			//elastic.NewTermsQuery("toptype", "拟建"), // 过滤 subtype
 		)
 
 	searchResult, err := client.Search().
@@ -541,7 +541,7 @@ func searchES(client *elastic.Client, projectName, buyer2 string) ([]map[string]
 	var results []map[string]interface{}
 	seenProjectNames := make(map[string]bool) // 用于去重
 	seenProjectCode := make(map[string]bool)  // 用于去重
-	bidamountMap := make(map[string]float64)
+	bidamountMap := make(map[float64]bool)
 	for _, hit := range searchResult.Hits.Hits {
 		var doc map[string]interface{}
 		err := json.Unmarshal(hit.Source, &doc)
@@ -592,13 +592,16 @@ func searchES(client *elastic.Client, projectName, buyer2 string) ([]map[string]
 		//	continue
 		//}
 		// **去重逻辑**:如果 `projectname` 已经出现过,则跳过
-		if seenProjectNames[projectNameValue] && bidamount == bidamountMap[projectNameValue] {
+		if seenProjectNames[projectNameValue] {
 			continue
 		}
 
+		if bidamountMap[bidamount] {
+			continue
+		}
 		// **记录该 `projectname`,避免重复**
 		seenProjectNames[projectNameValue] = true
-		bidamountMap[projectNameValue] = bidamount
+		bidamountMap[bidamount] = true
 
 		// **存入 MongoDB**
 		//err = MgoB.InsertOrUpdate("qfw", "wcc_20250312_bidding", doc)
@@ -651,13 +654,16 @@ func searchES(client *elastic.Client, projectName, buyer2 string) ([]map[string]
 			continue
 		}
 		// **去重逻辑**:如果 `projectname` 已经出现过,则跳过
-		if seenProjectNames[projectNameValue] && bidamount == bidamountMap[projectNameValue] {
+		if seenProjectNames[projectNameValue] {
+			continue
+		}
+		if bidamountMap[bidamount] {
 			continue
 		}
 
 		// **记录该 `projectname`,避免重复**
 		seenProjectNames[projectNameValue] = true
-		bidamountMap[projectNameValue] = bidamount
+		bidamountMap[bidamount] = true
 
 		// **存入 MongoDB**
 		//err = MgoB.InsertOrUpdate("qfw", "wcc_20250312_bidding", doc)
@@ -674,11 +680,11 @@ func searchES(client *elastic.Client, projectName, buyer2 string) ([]map[string]
 		}
 	}
 
-	//for _, vv := range results {
-	//	id := util.ObjToString(vv["id"])
-	//	bidData, _ := MgoB.FindById("bidding", id, nil)
-	//	MgoB.SaveByOriID("wcc_biddind_20250318", bidData)
-	//}
+	for _, vv := range results {
+		id := util.ObjToString(vv["id"])
+		bidData, _ := MgoB.FindById("bidding", id, nil)
+		MgoB.SaveByOriID("wcc_biddind_20250326", bidData)
+	}
 	return results, nil
 }
 

+ 2 - 0
getEs/go.mod

@@ -59,6 +59,8 @@ require (
 	github.com/rivo/uniseg v0.4.4 // indirect
 	github.com/segmentio/asm v1.2.0 // indirect
 	github.com/shopspring/decimal v1.4.0 // indirect
+	github.com/vesoft-inc/fbthrift v0.0.0-20230214024353-fa2f34755b28 // indirect
+	github.com/vesoft-inc/nebula-go/v3 v3.8.0 // indirect
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 	github.com/xdg-go/scram v1.1.1 // indirect
 	github.com/xdg-go/stringprep v1.0.3 // indirect

+ 4 - 0
getEs/go.sum

@@ -1816,6 +1816,10 @@ github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN
 github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI=
 github.com/vektah/gqlparser/v2 v2.4.5/go.mod h1:flJWIR04IMQPGz+BXLrORkrARBxv/rtyIAFvd/MceW0=
 github.com/veraison/go-cose v1.0.0-rc.1/go.mod h1:7ziE85vSq4ScFTg6wyoMXjucIGOf4JkFEZi/an96Ct4=
+github.com/vesoft-inc/fbthrift v0.0.0-20230214024353-fa2f34755b28 h1:gpoPCGeOEuk/TnoY9nLVK1FoBM5ie7zY3BPVG8q43ME=
+github.com/vesoft-inc/fbthrift v0.0.0-20230214024353-fa2f34755b28/go.mod h1:xu7e9za8StcJhBZmCDwK1Hyv4/Y0xFsjS+uqp10ECJg=
+github.com/vesoft-inc/nebula-go/v3 v3.8.0 h1:ecB87KMnMUcuKbgFESKIscdxA7Y1TcX7XEVqZQ1UqlA=
+github.com/vesoft-inc/nebula-go/v3 v3.8.0/go.mod h1:YTNAQzimjXLXUaEDOzty/eCCye+9zkZRuUzXz9LQUpU=
 github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
 github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
 github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=

+ 31 - 30
getEs/main.go

@@ -20,24 +20,25 @@ var (
 	MgoB *mongodb.MongodbSim
 )
 
-func InitMgo() {
-	MgoB = &mongodb.MongodbSim{
-		MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
-		//MongodbAddr: "127.0.0.1:27083",
-		Size:     10,
-		DbName:   "qfw",
-		UserName: "SJZY_RWbid_ES",
-		Password: "SJZY@B4i4D5e6S",
-		//Direct:      true,
-	}
-	MgoB.InitPool()
-}
-
-func main() {
-	InitMgo()
-	getDataFromFile()
+//func InitMgo() {
+//	MgoB = &mongodb.MongodbSim{
+//		MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
+//		//MongodbAddr: "127.0.0.1:27083",
+//		Size:     10,
+//		DbName:   "qfw",
+//		UserName: "SJZY_RWbid_ES",
+//		Password: "SJZY@B4i4D5e6S",
+//		//Direct:      true,
+//	}
+//	MgoB.InitPool()
+//}
+
+func main2222() {
+	//InitMgo()
+	//getDataFromFile()
 	//updateXlsxDa()
-	return
+
+	//return
 	/**
 	getProjectData  click 是一起使用的,统计获取中标企业信息
 	*/
@@ -49,7 +50,7 @@ func main() {
 	//getProject()
 	//getQyLimitData()
 	//getBiddingData()
-	//getQyxytData()
+	getQyxytData()
 	//getTidb()
 
 	//getEntInfo() //法人库数据
@@ -389,8 +390,8 @@ func getProjectDataFromEs() {
 
 // getQyxytData 获取企业数据
 func getQyxytData() {
-	url := "http://172.17.4.184:19908"
-	//url := "http://127.0.0.1:19908"
+	//url := "http://172.17.4.184:19908"
+	url := "http://127.0.0.1:19908"
 	username := "jybid"
 	password := "Top2023_JEB01i@31"
 	index := "qyxy" //索引名称
@@ -413,16 +414,16 @@ func getQyxytData() {
 	//}
 	//Mgo.InitPool()
 
-	MgoB := &mongodb.MongodbSim{
-		MongodbAddr: "172.17.189.140:27080",
-		//MongodbAddr: "127.0.0.1:27083",
-		Size:     10,
-		DbName:   "qfw",
-		UserName: "SJZY_RWbid_ES",
-		Password: "SJZY@B4i4D5e6S",
-		//Direct:   true,
-	}
-	MgoB.InitPool()
+	//MgoB := &mongodb.MongodbSim{
+	//	MongodbAddr: "172.17.189.140:27080",
+	//	//MongodbAddr: "127.0.0.1:27083",
+	//	Size:     10,
+	//	DbName:   "qfw",
+	//	UserName: "SJZY_RWbid_ES",
+	//	Password: "SJZY@B4i4D5e6S",
+	//	//Direct:   true,
+	//}
+	//MgoB.InitPool()
 
 	//2023年01-01  2023-10-01,,1-3季度
 	//2024-1 - 2024-4;1704038400-1711900800

+ 1 - 0
graph/config.go

@@ -0,0 +1 @@
+package main

+ 32 - 0
graph/go.mod

@@ -0,0 +1,32 @@
+module graph
+
+go 1.23.7
+
+require (
+	github.com/olivere/elastic/v7 v7.0.32
+	github.com/vesoft-inc/nebula-go/v3 v3.8.0
+	jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240412074219-927f3f682cb3
+)
+
+require (
+	github.com/PuerkitoBio/goquery v1.8.0 // indirect
+	github.com/andybalholm/cascadia v1.3.1 // indirect
+	github.com/dchest/captcha v1.0.0 // indirect
+	github.com/golang/snappy v0.0.1 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/klauspost/compress v1.13.6 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/vesoft-inc/fbthrift v0.0.0-20230214024353-fa2f34755b28 // indirect
+	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
+	github.com/xdg-go/scram v1.1.1 // indirect
+	github.com/xdg-go/stringprep v1.0.3 // indirect
+	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
+	go.mongodb.org/mongo-driver v1.10.1 // indirect
+	golang.org/x/crypto v0.14.0 // indirect
+	golang.org/x/net v0.17.0 // indirect
+	golang.org/x/sync v0.1.0 // indirect
+	golang.org/x/text v0.13.0 // indirect
+	gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect
+)

+ 228 - 0
graph/go.sum

@@ -0,0 +1,228 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
+github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
+github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
+github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
+github.com/aws/aws-sdk-go v1.43.21/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o=
+github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo=
+github.com/elastic/go-elasticsearch/v7 v7.17.10/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
+github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
+github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
+github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
+github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E=
+github.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
+github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
+github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/vesoft-inc/fbthrift v0.0.0-20230214024353-fa2f34755b28 h1:gpoPCGeOEuk/TnoY9nLVK1FoBM5ie7zY3BPVG8q43ME=
+github.com/vesoft-inc/fbthrift v0.0.0-20230214024353-fa2f34755b28/go.mod h1:xu7e9za8StcJhBZmCDwK1Hyv4/Y0xFsjS+uqp10ECJg=
+github.com/vesoft-inc/nebula-go/v3 v3.8.0 h1:ecB87KMnMUcuKbgFESKIscdxA7Y1TcX7XEVqZQ1UqlA=
+github.com/vesoft-inc/nebula-go/v3 v3.8.0/go.mod h1:YTNAQzimjXLXUaEDOzty/eCCye+9zkZRuUzXz9LQUpU=
+github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
+github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
+github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
+github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
+github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs=
+github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+go.mongodb.org/mongo-driver v1.10.1 h1:NujsPveKwHaWuKUer/ceo9DzEe7HIj1SlJ6uvXZG0S4=
+go.mongodb.org/mongo-driver v1.10.1/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opentelemetry.io/otel v1.5.0/go.mod h1:Jm/m+rNp/z0eqJc74H7LPwQ3G87qkU/AnnAydAjSAHk=
+go.opentelemetry.io/otel/trace v1.5.0/go.mod h1:sq55kfhjXYr1zVSyexg0w1mpa03AYXR5eyTkB9NPPdE=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240412074219-927f3f682cb3 h1:mTokQIoOu/oZ2oCSAPayIFfnglIHP0qbOw1Ez6biKDo=
+jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240412074219-927f3f682cb3/go.mod h1:1Rp0ioZBhikjXHYYXmnzL6RNfvTDM/2XvRB+vuPLurI=

BIN
updateBidding/updateBiddingEsHref → graph/graph


+ 17 - 0
graph/init.go

@@ -0,0 +1,17 @@
+package main
+
+import "jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+
+func InitMgo() {
+	//181 凭安库
+	Mgo181 = &mongodb.MongodbSim{
+		MongodbAddr: "172.17.4.181:27001",
+		//MongodbAddr: "127.0.0.1:27001",
+		DbName:   "mixdata",
+		Size:     10,
+		UserName: "",
+		Password: "",
+		//Direct:      true,
+	}
+	Mgo181.InitPool()
+}

+ 584 - 0
graph/main.go

@@ -0,0 +1,584 @@
+package main
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"github.com/olivere/elastic/v7"
+	nebula "github.com/vesoft-inc/nebula-go/v3"
+	"io"
+	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+	"log"
+	"regexp"
+	"strconv"
+	"strings"
+)
+
+var (
+	re       = regexp.MustCompile(`[-+]?[0-9]*\.?[0-9]+`)
+	HostList = []nebula.HostAddress{{Host: "114.116.213.97", Port: 9669}}
+	//HostList = []nebula.HostAddress{{Host: "127.0.0.1", Port: 9669}}
+	UserName    = "root"
+	PassWord    = "jianyu@123"
+	Mgo181      *mongodb.MongodbSim
+	Table_Space = "legal_profile"
+)
+
+// Legal 代表公司节点的结构体
+type Legal struct {
+	Name string
+	Code string
+	Type string
+}
+
+// Invest 代表公司之间的投资关系边的结构体
+type Invest struct {
+	FromCode string
+	ToCode   string
+	Amount   float64
+	Ratio    float64
+}
+
+type InvestVertex struct { //顶点
+	id           string
+	company_id   string
+	company_name string
+	credit_no    string
+}
+
+type InvestEdge struct { //边
+	company_id   string
+	company_name string
+	stock_id     string
+	stock_name   string
+	stock_rate   float64
+	stock_amount float64
+	stock_level  int
+	stock_type   int //0企业股东 1自然人股东
+}
+
+// ConnectToNebula 封装数据库连接函数
+func ConnectToNebula(hosts []nebula.HostAddress, username, password string) (*nebula.Session, *nebula.ConnectionPool, error) {
+	// 创建连接池配置
+	config := nebula.GetDefaultConf()
+	config.UseHTTP2 = false
+	config.HandshakeKey = ""
+
+	// 初始化连接池
+	pool, err := nebula.NewConnectionPool(hosts, config, nebula.DefaultLogger{})
+	if err != nil {
+		return nil, nil, err
+	}
+
+	// 获取会话
+	session, err := pool.GetSession(username, password)
+	if err != nil {
+		pool.Close()
+		return nil, nil, err
+	}
+	return session, pool, nil
+}
+
+func main() {
+	InitMgo()
+	getQyxytData()
+	//
+
+	log.Println("数据处理完毕!!!!!!!")
+}
+
+func dda() {
+	name := "北京拓普丰联信息科技股份有限公司"
+	rea, resb := GetInvByLevel(name, 5, 0, false)
+
+	// 调用封装的连接函数
+	session, pool, err := ConnectToNebula(HostList, UserName, PassWord)
+	if err != nil {
+		log.Fatalf("Failed to connect to Nebula Graph: %v", err)
+	}
+	defer pool.Close()
+	defer session.Release()
+	for _, v := range rea {
+		d := Legal{
+			Name: v.company_name,
+			Code: v.credit_no,
+		}
+		res, err := InsertCompany(session, d)
+		if err != nil {
+			log.Println(err, res)
+		}
+	}
+
+	for _, v := range resb {
+		d := Invest{
+			FromCode: v.stock_name,
+			ToCode:   v.company_name,
+			Amount:   v.stock_amount,
+			Ratio:    v.stock_rate,
+		}
+
+		err := InsertInvestRel(session, d)
+		if err != nil {
+			log.Println(err, d)
+		}
+	}
+}
+
+// getQyxytData 获取企业数据
+func getQyxytData() {
+	// 调用封装的连接函数
+	session, pool, err := ConnectToNebula(HostList, UserName, PassWord)
+	if err != nil {
+		log.Fatalf("Failed to connect to Nebula Graph: %v", err)
+	}
+	defer pool.Close()
+	defer session.Release()
+
+	url := "http://172.17.4.184:19908"
+	//url := "http://127.0.0.1:19908"
+	username := "jybid"
+	password := "Top2023_JEB01i@31"
+	index := "qyxy" //索引名称
+	// 创建 Elasticsearch 客户端
+	client, err := elastic.NewClient(
+		elastic.SetURL(url),
+		elastic.SetBasicAuth(username, password),
+		elastic.SetSniff(false),
+	)
+	if err != nil {
+		log.Fatalf("创建 Elasticsearch 客户端失败:%s", err)
+	}
+
+	//---------------------------//
+	//query := elastic.NewBoolQuery()
+	//query.Must(elastic.NewMatchQuery("business_scope", "招投标代理"))
+	//query.Must(elastic.NewTermQuery("company_city", "北京市"))
+
+	//rangeQuery := elastic.NewRangeQuery("comeintime").Gte("1640966400").Lt("1703952000")
+	query := elastic.NewBoolQuery().
+		//北京,天津,河北,上海,江苏,浙江,安徽
+		//Must(elastic.NewTermQuery("area", "北京市")).
+		//Must(elastic.NewTermsQuery("subtype", "中标", "单一", "成交", "合同")).
+		MustNot(
+			elastic.NewTermQuery("company_type", "个体工商户"),
+		).
+		//Must(elastic.NewTermQuery("company_name", "河南拓普计算机网络工程有限公司"))
+		Must(elastic.NewTermsQuery("company_area", "河南"))
+
+	ctx := context.Background()
+	//开始滚动搜索
+	scrollID := ""
+	scroll := "10m"
+	searchSource := elastic.NewSearchSource().
+		Query(query).
+		Size(10000).
+		Sort("_doc", true) //升序排序
+	//Sort("_doc", false) //降序排序
+
+	searchService := client.Scroll(index).
+		Size(10000).
+		Scroll(scroll).
+		SearchSource(searchSource)
+
+	res, err := searchService.Do(ctx)
+
+	if err != nil {
+		if err == io.EOF {
+			fmt.Println("没有数据")
+		} else {
+			panic(err)
+		}
+
+	}
+	//defer client.ClearScroll().ScrollId(scrollID).Do(ctx) // 在退出时清理资源
+	fmt.Println("总数是:", res.TotalHits())
+
+	total := 0
+	for len(res.Hits.Hits) > 0 {
+		for _, hit := range res.Hits.Hits {
+			var doc map[string]interface{}
+			err := json.Unmarshal(hit.Source, &doc)
+			if err != nil {
+				log.Printf("解析文档失败:%s", err)
+				continue
+			}
+
+			company1 := Legal{
+				Name: util.ObjToString(doc["company_name"]),
+				Code: util.ObjToString(doc["credit_no"]),
+				Type: "企业",
+			}
+
+			/**
+			1.stock_name_id 为空,直接跳过
+			2.stock_name 为空,直接跳过
+			3.stock_name 含有 已除名/不适宜/待清理/拟吊销 ,直接跳过
+			4.stock_name 不含中文,跳过
+			*/
+
+			if util.ObjToString(doc["company_name"]) == "" || util.ObjToString(doc["credit_no"]) == "" {
+				continue
+			}
+			if strings.Contains(util.ObjToString(doc["company_name"]), "已除名") {
+				continue
+			}
+			res1, err1 := InsertCompany(session, company1)
+			if err != nil {
+				log.Println("InsertCompany err", res1, err1)
+			}
+
+			//边
+			if partners, ok := doc["partners"].([]interface{}); ok {
+				for _, partner := range partners {
+					if da, ok := partner.(map[string]interface{}); ok {
+						if util.ObjToString(da["stock_type"]) == "企业法人" {
+							if util.ObjToString(da["stock_name"]) == "" || util.ObjToString(da["identify_no"]) == "" {
+								continue
+							} else {
+								company2 := Legal{
+									Name: util.ObjToString(da["stock_name"]),
+									Code: util.ObjToString(da["identify_no"]),
+									Type: "企业",
+								}
+								res2, err2 := InsertCompany(session, company2)
+								if err2 != nil {
+									log.Println("InsertCompany err", res2, err2)
+								}
+								//
+
+								if err1 != nil || err2 != nil {
+									continue
+								}
+								where := map[string]interface{}{
+									"company_name": util.ObjToString(doc["company_name"]),
+									"stock_name":   util.ObjToString(da["stock_name"]),
+								}
+
+								ddd, _ := Mgo181.FindOne("company_partner", where)
+								if len(*ddd) > 0 {
+									par := *ddd
+									amount := ParseStockCapital(util.ObjToString(par["stock_capital"]))
+									investRel := Invest{FromCode: util.ObjToString(da["stock_name"]), ToCode: util.ObjToString(doc["company_name"]), Ratio: util.Float64All(par["stock_proportion"]), Amount: amount}
+									err = InsertInvestRel(session, investRel)
+									if err != nil {
+										log.Println("InsertInvestRel", err, investRel)
+									}
+								}
+							}
+
+						}
+					}
+				}
+			}
+
+		}
+
+		total = total + len(res.Hits.Hits)
+		scrollID = res.ScrollId
+		res, err = client.Scroll().ScrollId(scrollID).Scroll(scroll).Do(ctx)
+		log.Println("current count:", total)
+		if err != nil {
+			if err == io.EOF {
+				// 滚动到最后一批数据,退出循环
+				break
+			}
+			log.Println("滚动搜索失败:", err, res)
+			break // 处理错误时退出循环
+		}
+	}
+	// 在循环外调用 ClearScroll
+	_, err = client.ClearScroll().ScrollId(scrollID).Do(ctx)
+	if err != nil {
+		log.Printf("清理滚动搜索失败:%s", err)
+	}
+
+	log.Println("结束~~~~~~~~~~~~~~~")
+}
+
+// dealCompanyPartner 处理企业投资关系
+func dealCompanyPartner() {
+	// 调用封装的连接函数
+	session, pool, err := ConnectToNebula(HostList, UserName, PassWord)
+	if err != nil {
+		log.Fatalf("Failed to connect to Nebula Graph: %v", err)
+	}
+	defer pool.Close()
+	defer session.Release()
+
+	//log.Println("session", session)
+
+	defer util.Catch()
+	sess := Mgo181.GetMgoConn()
+	defer Mgo181.DestoryMongoConn(sess)
+
+	it := sess.DB("mixdata").C("company_partner").Find(nil).Select(nil).Iter()
+	count := 0
+	//realNum := 0
+	for tmp := make(map[string]interface{}); it.Next(&tmp); count++ {
+		if count%10000 == 0 {
+			log.Println("current:", count, tmp["stock_name"], tmp["company_name"])
+		}
+		//个人企业跳过
+		if util.IntAll(tmp["is_personal"]) == 1 {
+			continue
+		}
+		if util.IntAll(tmp["use_flag"]) > 0 {
+			continue
+		}
+
+		company1 := Legal{
+			Name: util.ObjToString(tmp["stock_name"]),
+			Code: util.ObjToString(tmp["stock_name_id"]),
+		}
+
+		/**
+		1.stock_name_id 为空,直接跳过
+		2.stock_name 为空,直接跳过
+		3.stock_name 含有 已除名/不适宜/待清理/拟吊销 ,直接跳过
+		4.stock_name 不含中文,跳过
+		*/
+
+		company2 := Legal{
+			Name: util.ObjToString(tmp["company_name"]),
+			Code: util.ObjToString(tmp["company_id"]),
+		}
+		res1, err1 := InsertCompany(session, company1)
+		if err != nil {
+			log.Println("InsertCompany err", res1, err1)
+		}
+		res2, err2 := InsertCompany(session, company2)
+		if err != nil {
+			log.Println("InsertCompany err", res2, err2)
+		}
+		if err1 != nil || err2 != nil {
+			continue
+		}
+		//边
+		amount := ParseStockCapital(util.ObjToString(tmp["stock_capital"]))
+		investRel := Invest{FromCode: res1, ToCode: res2, Ratio: util.Float64All(tmp["stock_proportion"]), Amount: amount}
+		err = InsertInvestRel(session, investRel)
+		if err != nil {
+			log.Println("InsertInvestRel", err, investRel)
+		}
+	}
+}
+
+// InsertCompany 插入公司节点的方法
+func InsertCompany(session *nebula.Session, company Legal) (string, error) {
+	// 构建插入公司节点的查询
+	//insertCompanyStmt := `
+	//	USE ` + Table_Space + `;
+	//	INSERT VERTEX company(company_id,name) VALUES "%s":("%s", "%s");
+	//`
+	//insertCompanyStmt = fmt.Sprintf(insertCompanyStmt, inv.id, inv.company_id, inv.company_name)
+	query := fmt.Sprintf(`
+		USE `+Table_Space+`;
+		INSERT VERTEX Legal(name, code, type) VALUES "%s":("%s", "%s", "%s")
+	`, company.Name, company.Name, company.Code, company.Type)
+
+	// 执行查询
+	result, err := session.Execute(query)
+	if err != nil {
+		log.Println("InsertCompany", result)
+		return "", err
+	}
+
+	// 打印返回结果
+	//fmt.Println("Insert Company Result:", result)
+
+	// 返回节点ID(通常可以通过返回的结果中的 "_vid" 字段获取)
+	return company.Name, nil
+}
+
+// InsertInvestRel 插入投资关系边的方法
+func InsertInvestRel(session *nebula.Session, investRel Invest) error {
+	// 构建插入投资关系边的查询
+	query := fmt.Sprintf(`
+		USE `+Table_Space+`;
+		INSERT EDGE Invest(amount, ratio) VALUES "%s"->"%s":(%f, %f)
+	`, investRel.FromCode, investRel.ToCode, investRel.Amount, investRel.Ratio)
+
+	// 执行查询
+	result, err := session.Execute(query)
+	if err != nil {
+		log.Println("InsertInvestRel", result)
+		return err
+	}
+
+	// 打印返回结果
+	//fmt.Println("Insert InvestRel Result:", result)
+	return nil
+}
+
+func ParseStockCapital(raw string) float64 {
+	raw = strings.TrimSpace(raw)
+	// 默认单位:万元人民币
+	exchangeRateUSD := 7.0
+	// 匹配数值部分(可能带小数)
+	re := regexp.MustCompile(`([\d.]+)`)
+	match := re.FindStringSubmatch(raw)
+	if len(match) < 2 {
+		return 0
+	}
+
+	value, _ := strconv.ParseFloat(match[1], 64)
+
+	// 判断单位并转换
+	switch {
+	case strings.Contains(raw, "万美元"):
+		value *= exchangeRateUSD // 转换成人民币
+	case strings.Contains(raw, "元") || strings.Contains(raw, "人民币"):
+		if strings.Contains(raw, "万元") || strings.Contains(raw, "万") {
+			// 已经是万元单位,无需处理
+		} else {
+			// 是“元”,需要除以1万
+			value = value / 10000
+		}
+	default:
+		// 可能是纯数字,默认视为“万元”
+	}
+
+	return value
+}
+
+/*
+根据公司名称和层级向上挖掘,获取顶点和边;
+maxLevel 挖掘层级数量;
+direction 0:双向挖掘 -1:向上挖掘 1:向下挖掘
+person true:保留自然人股东 false:不保留自然人股东
+*/
+func GetInvByLevel(company_name string, maxLevel int, direction int, person bool) (map[string]InvestVertex, []InvestEdge) {
+	verter := map[string]InvestVertex{}
+	edges := []InvestEdge{}
+	if direction == 0 {
+		v1, e1 := getInvByLevel(company_name, maxLevel, 1, person)
+		v2, e2 := getInvByLevel(company_name, maxLevel, -1, person)
+		for k, v := range v1 {
+			verter[k] = v
+		}
+		for k, v := range v2 {
+			verter[k] = v
+		}
+		edges = append(edges, e1...)
+		edges = append(edges, e2...)
+
+	} else {
+		verter, edges = getInvByLevel(company_name, maxLevel, direction, person)
+	}
+	return verter, edges
+}
+
+func getInvByLevel(company_name string, maxLevel int, direction int, person bool) (map[string]InvestVertex, []InvestEdge) {
+	data, _ := Mgo181.FindOne("company_base", map[string]interface{}{
+		"company_name": company_name,
+	})
+	company_id := fmt.Sprint((*data)["company_id"])
+	credit_no := fmt.Sprint((*data)["credit_no"])
+	var edges = []InvestEdge{}             //记录边
+	var verter = map[string]InvestVertex{} //有效顶点
+	// 初始化队列和访问记录
+	type node struct {
+		companyID, companyName, creditNo string
+		level                            int
+	}
+	queue := []node{{companyID: company_id, companyName: company_name, creditNo: credit_no, level: 1}}
+	visited := make(map[string]bool)
+	for len(queue) > 0 {
+		current := queue[0]
+		if _, ok := verter[current.companyID]; !ok {
+			verter[current.companyID] = InvestVertex{
+				id:           current.companyID,
+				company_id:   current.companyID,
+				company_name: current.companyName,
+				credit_no:    current.creditNo,
+			}
+		}
+		queue = queue[1:]
+		if visited[current.companyID] || current.level > maxLevel { // 防止重复处理和超过最大层级
+			continue
+		}
+		visited[current.companyID] = true
+		query := map[string]interface{}{"company_id": current.companyID}
+		if direction > 0 {
+			query = map[string]interface{}{"stock_name_id": current.companyID}
+		}
+		partners, _ := Mgo181.Find("company_partner", query, nil, nil, false, -1, -1)
+		// 处理股东数据
+		for _, p := range *partners {
+			//log.Println(direction, p)
+			if fmt.Sprint(p["is_history"]) == "1" {
+				continue
+			}
+			// 构建投资关系
+			inv := InvestEdge{
+				company_id:   fmt.Sprint(p["company_id"]),
+				company_name: fmt.Sprint(p["company_name"]),
+				stock_id:     fmt.Sprint(p["stock_name_id"]),
+				stock_name:   fmt.Sprint(p["stock_name"]),
+				stock_rate:   convertStockCapitalToFloat(fmt.Sprint(p["stock_proportion"])),
+				stock_amount: convertStockCapitalToFloat(fmt.Sprint(p["stock_capital"])),
+				stock_level:  current.level,
+				stock_type:   0, // 默认机构股东
+			}
+			edges = append(edges, inv)
+
+			// 根据股东类型是否继续挖掘
+			if fmt.Sprint(p["stock_type"]) == "自然人股东" || convertStockCapitalToFloat(fmt.Sprint(p["is_personal"])) > 0 {
+				inv.stock_type = 1
+				if _, ok := verter[inv.stock_id]; !ok && person {
+					verter[inv.stock_id] = InvestVertex{
+						id:           inv.stock_id,
+						company_id:   inv.stock_id,
+						company_name: inv.stock_name,
+					}
+				}
+			} else {
+				where1 := map[string]interface{}{
+					"company_name": inv.company_name,
+				}
+				where2 := map[string]interface{}{
+					"company_name": inv.stock_name,
+				}
+				company, _ := Mgo181.FindOne("company_base", where1)
+				stock, _ := Mgo181.FindOne("company_base", where2)
+				// 机构股东加入队列继续穿透
+				if direction > 0 { //向下挖掘
+					if !visited[inv.company_id] {
+						queue = append(queue, node{
+							companyID:   inv.company_id,
+							companyName: inv.company_name,
+							creditNo:    util.ObjToString((*company)["credit_no"]),
+							level:       current.level + 1,
+						})
+					}
+				} else { //向上挖掘
+					if !visited[inv.stock_id] {
+						queue = append(queue, node{
+							companyID:   inv.stock_id,
+							companyName: inv.stock_name,
+							creditNo:    util.ObjToString((*stock)["credit_no"]),
+							level:       current.level + 1,
+						})
+					}
+				}
+			}
+		}
+		log.Printf("已处理层级%d,当前队列深度%d", current.level, len(queue))
+	}
+	return verter, edges
+}
+
+func convertStockCapitalToFloat(str string) float64 {
+	// 查找匹配的数字
+	match := re.FindString(str)
+	if match == "" {
+		return 0
+	}
+	// 将匹配到的数字字符串转换为浮点数
+	result, err := strconv.ParseFloat(match, 64)
+	if err != nil {
+		return 0
+	}
+	return result
+}

+ 3 - 0
graph/readme.txt

@@ -0,0 +1,3 @@
+处理 EquityGraph,
+处理凭安企业数据,分为 投资关系和疑似有关系
+目的;为了找出 相关的企业信息

+ 46 - 39
updateBidding/main.go

@@ -41,13 +41,13 @@ var (
 
 func Init() {
 	MgoB = &mongodb.MongodbSim{
-		//MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
-		MongodbAddr: "127.0.0.1:27083",
-		DbName:      "qfw",
-		Size:        10,
-		UserName:    "SJZY_RWbid_ES",
-		Password:    "SJZY@B4i4D5e6S",
-		Direct:      true,
+		MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
+		//MongodbAddr: "127.0.0.1:27083",
+		DbName:   "qfw",
+		Size:     10,
+		UserName: "SJZY_RWbid_ES",
+		Password: "SJZY@B4i4D5e6S",
+		//Direct:      true,
 	}
 	MgoB.InitPool()
 
@@ -75,14 +75,14 @@ func Init() {
 	//Mgo.InitPool()
 
 	//85
-	MgoR = &mongodb.MongodbSim{
-		MongodbAddr: "127.0.0.1:27080",
-		//MongodbAddr: "172.17.4.85:27080",
-		DbName: "qfw",
-		Size:   10,
-		Direct: true,
-	}
-	MgoR.InitPool()
+	//MgoR = &mongodb.MongodbSim{
+	//	MongodbAddr: "127.0.0.1:27080",
+	//	//MongodbAddr: "172.17.4.85:27080",
+	//	DbName: "qfw",
+	//	Size:   10,
+	//	Direct: true,
+	//}
+	//MgoR.InitPool()
 
 	//测试环境MongoDB
 	//MgoT = &mongodb.MongodbSim{
@@ -108,8 +108,8 @@ func Init() {
 
 	//es
 	Es = &elastic.Elastic{
-		S_esurl: "http://127.0.0.1:19908",
-		//S_esurl:  "http://172.17.4.184:19908",
+		//S_esurl: "http://127.0.0.1:19908",
+		S_esurl:  "http://172.17.4.184:19908",
 		I_size:   5,
 		Username: "jybid",
 		Password: "Top2023_JEB01i@31",
@@ -117,14 +117,14 @@ func Init() {
 	Es.InitElasticSize()
 
 	//es 新集群
-	//EsNew = &elastic.Elastic{
-	//	S_esurl: "http://127.0.0.1:19905",
-	//	//S_esurl:  "http://172.17.4.184:19905",
-	//	I_size:   5,
-	//	Username: "jybid",
-	//	Password: "Top2023_JEB01i@31",
-	//}
-	//EsNew.InitElasticSize()
+	EsNew = &elastic.Elastic{
+		//S_esurl: "http://127.0.0.1:19905",
+		S_esurl:  "http://172.17.4.184:19905",
+		I_size:   5,
+		Username: "jybid",
+		Password: "Top2023_JEB01i@31",
+	}
+	EsNew.InitElasticSize()
 }
 
 func main() {
@@ -135,7 +135,7 @@ func main() {
 	//go updateEsHrefMethod() //更新es href 字段
 	//go updateProjectEsMethod()
 	//taskRunProject()
-	//taskRunBidding()
+	taskRunBidding()
 	//dealBidding() //正式环境bidding数据处理
 	//dealBiddingAi() //正式环境bidding数据处理
 	//dealBiddingTest() // 测试环境数据处理
@@ -175,8 +175,8 @@ func InitEsBiddingField() {
 // taskRun 更新es 省市区三个字段
 func taskRunBidding() {
 	defer util.Catch()
-	sess := Mgo.GetMgoConn()
-	defer Mgo.DestoryMongoConn(sess)
+	sess := MgoB.GetMgoConn()
+	defer MgoB.DestoryMongoConn(sess)
 
 	//查询条件
 	//q := map[string]interface{}{
@@ -197,13 +197,13 @@ func taskRunBidding() {
 	//}
 
 	//selected := map[string]interface{}{"contenthtml": 0, "detail": 0}
-	it := sess.DB("qfw").C("zktest_bidding_0706").Find(nil).Select(nil).Sort("_id").Iter()
+	it := sess.DB("qfw").C("zktest_0401").Find(nil).Select(nil).Iter()
 
 	fmt.Println("taskRun 开始")
 	count := 0
 	//realNum := 0
 	for tmp := make(map[string]interface{}); it.Next(&tmp); count++ {
-		if count%1000 == 0 {
+		if count%100 == 0 {
 			log.Info("current", log.Int("count", count), log.Any("_id", tmp["_id"]))
 		}
 
@@ -222,19 +222,26 @@ func taskRunBidding() {
 		//	update["city"] = ""
 		//}
 		//
-		//if district, ok := tmp["district"]; ok && district != nil {
-		//	update["district"] = district
-		//} else {
-		//	update["district"] = ""
-		//}
+		if district, ok := tmp["district"]; ok && district != nil {
+			if district == "乌拉盖管委会" {
+				update["district"] = "乌拉盖管理区管委会"
+			} else if district == "错那县" {
+				update["district"] = "错那市"
+			} else if district == "河南周口经济开发区" {
+				update["district"] = "周口临港开发区"
+			} else if district == "米林县" {
+				update["district"] = "米林市"
+			}
+
+		}
 
 		// 2.更新中标单位
 
 		biddingID := util.ObjToString(tmp["id"])
-		//biddingID := mongodb.BsonIdToSId(tmp["_id"])
-		update["winner"] = ""
-		update["s_winner"] = ""
-
+		////biddingID := mongodb.BsonIdToSId(tmp["_id"])
+		//update["winner"] = ""
+		//update["s_winner"] = ""
+		//
 		if len(update) > 0 {
 			//Mgo.UpdateById("bidding", biddingID, map[string]interface{}{"$set": update})
 			//2.es 项目 更新字段

BIN
updateBidding/updateBiddingNiJian → updateBidding/updateBidding


BIN
updateBidding/updateBiddingEsHref_ai


+ 1 - 1
xlsx/xlsx_test.go

@@ -371,7 +371,7 @@ func TestZZ(t *testing.T) {
 	defer Mgo.DestoryMongoConn(sess)
 
 	//f, err := excelize.OpenFile("./山东2024专项债.xlsx")
-	f, err := excelize.OpenFile("./天津市专项债数据.xlsx")
+	f, err := excelize.OpenFile("./青岛市20250324专项债数据.xlsx")
 	//detailName := "specialbond_detail_202412" //专项债详细表
 	listName := "specialbond_list,specialbond_list_history,specialbond_list_202503" //专项债详细表
 	if err != nil {

BIN
xlsx/山东省20250324专项债数据.xlsx


BIN
xlsx/青岛市20250324专项债数据.xlsx