Browse Source

merge code

rdluck 4 years ago
parent
commit
44345e932f
4 changed files with 390 additions and 36 deletions
  1. 1 0
      models/article.go
  2. 35 1
      models/industry_map.go
  3. 53 34
      services/elasticsearch.go
  4. 301 1
      services/industry_map.go

+ 1 - 0
models/article.go

@@ -53,6 +53,7 @@ type ArticleDetail struct {
 	InterviewTime        time.Time `description:"访谈时间"`
 	ExpertBackground     string    `description:"专家背景"`
 	ExpertNumber         string    `description:"专家编号"`
+	Department           string    `description:"作者"`
 }
 
 func GetArticleDetailById(articleId int) (item *ArticleDetail, err error) {

+ 35 - 1
models/industry_map.go

@@ -30,6 +30,7 @@ type CygxIndustryMapItems struct {
 	IndustryMapId   int `orm:"column(industry_map_id);" description:"行业图谱id"`
 	IndustryMapName string
 	ParentId        int
+	Level        int
 	Children        []*CygxIndustryMapItems
 }
 
@@ -38,4 +39,37 @@ func GetCygxIndustryMapByParentId(parentId int) (items []*CygxIndustryMapItems,
 	sql := ` SELECT * FROM cygx_industry_map WHERE parent_id=?`
 	_, err = o.Raw(sql, parentId).QueryRows(&items)
 	return
-}
+}
+
+func GetCygxIndustryMapByLevel(level int) (items []*CygxIndustryMapItems, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM cygx_industry_map WHERE level=?`
+	_, err = o.Raw(sql, level).QueryRows(&items)
+	return
+}
+
+//根据名称模糊匹配获取一条数据
+func GetFirstCygxIndustryItemByName(industryName string) (items *CygxIndustryMapItems, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM cygx_industry_map WHERE industry_map_name like '%` + industryName + `%' order by industry_map_id asc`
+	err = o.Raw(sql).QueryRow(&items)
+	return
+}
+
+//根据名称模糊匹配获取一条数据
+func GetFirstCygxIndustryListByName(industryName string) (list []*CygxIndustryMapItems, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM cygx_industry_map WHERE industry_map_name like '%` + industryName + `%' order by level,industry_map_id asc`
+	_,err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+//根据名称模糊匹配获取一条数据
+func FixLevelData(industryMapId int,level int) (list []*CygxIndustryMapItems, err error) {
+	o := orm.NewOrm()
+	sql := ` UPDATE cygx_industry_map set level = ? WHERE industry_map_id = ?`
+	_,err = o.Raw(sql,level,industryMapId).QueryRows(&list)
+	return
+}
+
+//func

+ 53 - 34
services/elasticsearch.go

@@ -5,6 +5,7 @@ import (
 	"encoding/json"
 	"fmt"
 	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
 	"html"
 	"strconv"
 	"strings"
@@ -172,45 +173,63 @@ func SearchByKeyWord(keyWord,categoryName string, pageSize int) (result []*model
 
 	boolquery := elastic.NewBoolQuery()
 
-	boolquery.Must(elastic.NewMatchQuery("Title", keyWord), elastic.NewMatchQuery("BodyText", keyWord))
+	fmt.Println("get start keyWordArr")
+	keyWordArr, err := GetIndustryMapNameSlice(keyWord)
+	if err != nil {
+		go utils.SendEmail(utils.APPNAME+" "+utils.RunMode+"异常提醒:", "GetIndustryMapNameSlice:"+err.Error(), utils.EmailSendToUsers)
+	}
+	keyWordArr = append(keyWordArr, keyWord)
+	fmt.Println(keyWord)
+	fmt.Println(keyWordArr)
+	var newKeyWordArr []string
+	if len(keyWordArr) > 2 {
+		newKeyWordArr = append(keyWordArr[2:], keyWordArr[0:2]...)
+	}
+	fmt.Println(newKeyWordArr)
+	fmt.Println("get end keyWordArr")
+	searchMap := make(map[int]int)
+	for k, v := range newKeyWordArr {
+		fmt.Println(k, v)
 
-	highlight := elastic.NewHighlight()
-	highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText"))
-	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+		boolquery.Must(elastic.NewMatchQuery("Title", keyWord), elastic.NewMatchQuery("BodyText", keyWord))
 
-	searchByMatch, err := client.Search(esIndex).Highlight(highlight).Size(pageSize).Query(termsQuery).Query(boolquery).Do(context.Background())
+		highlight := elastic.NewHighlight()
+		highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText"))
+		highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
 
-	if err != nil {
-		return
-	}
-	if searchByMatch.Hits != nil {
-		for _, v := range searchByMatch.Hits.Hits {
-			articleJson, err := v.Source.MarshalJSON()
-			if err != nil {
-				return nil, err
-			}
-			article := new(models.CygxArticle)
-			err = json.Unmarshal(articleJson, &article)
-			if err != nil {
-				return nil, err
-			}
-			searchItem := new(models.SearchItem)
-			searchItem.ArticleId, _ = strconv.Atoi(v.Id)
-			searchItem.Body = v.Highlight["BodyText"]
-			var title string
-			if len(v.Highlight["Title"]) > 0 {
-				title = v.Highlight["Title"][0]
-			} else {
-				title = article.Title
+		searchByMatch, err := client.Search(esIndex).Highlight(highlight).Size(pageSize).Query(termsQuery).Query(boolquery).Do(context.Background())
+
+		if err != nil {
+			return result, err
+		}
+		if searchByMatch.Hits != nil {
+			for _, v := range searchByMatch.Hits.Hits {
+				articleJson, err := v.Source.MarshalJSON()
+				if err != nil {
+					return nil, err
+				}
+				article := new(models.CygxArticle)
+				err = json.Unmarshal(articleJson, &article)
+				if err != nil {
+					return nil, err
+				}
+				if _, ok := searchMap[article.ArticleId]; !ok {
+					searchItem := new(models.SearchItem)
+					searchItem.ArticleId, _ = strconv.Atoi(v.Id)
+					searchItem.Body = v.Highlight["BodyText"]
+					var title string
+					if len(v.Highlight["Title"]) > 0 {
+						title = v.Highlight["Title"][0]
+					} else {
+						title = article.Title
+					}
+					searchItem.Title = title
+					searchItem.PublishDate = article.PublishDate
+					result = append(result, searchItem)
+					searchMap[article.ArticleId] = article.ArticleId
+				}
 			}
-			searchItem.Title = title
-			searchItem.PublishDate = article.PublishDate
-			result = append(result, searchItem)
 		}
 	}
 	return
 }
-
-func GetIndustryNameMap(keyWord string) {
-
-}

+ 301 - 1
services/industry_map.go

@@ -5,6 +5,10 @@ import (
 	"fmt"
 	"hongze/hongze_cygx/models"
 	"hongze/hongze_cygx/utils"
+	"math/rand"
+	"reflect"
+	"sort"
+	"time"
 )
 
 
@@ -52,4 +56,300 @@ func GetIndustryMap() {
 	fmt.Println("Err:",err)
 	utils.FileLog.Info("allNodes:%s",string(resultJson))
 	fmt.Println("end")
-}
+}
+
+
+func GetIndustryTree()(rootNode *models.CygxIndustryMapItems, err error) {
+	fmt.Println("start")
+	list, err := models.GetCygxIndustryMapByParentId(0)
+	if err != nil {
+		fmt.Println("GetCygxIndustryMapByParentId Err:",err.Error())
+		return
+	}
+	rootNode = list[0]
+	allNodes, err := models.GetCygxIndustryMapAll()
+	if err != nil {
+		fmt.Println("GetCygxIndustryMapAll Err:"+err.Error())
+		return
+	}
+	MakeTree(allNodes, rootNode)
+	resultJson,err:=json.Marshal(rootNode)
+	fmt.Println("Err:",err)
+	fmt.Println("allNodes:",string(resultJson))
+	//utils.FileLog.Info("allNodes:%s",string(resultJson))
+	fmt.Println("end")
+	return
+}
+
+//获取对应的层级map
+func getMap(tree *models.CygxIndustryMapItems,item *models.CygxIndustryMapItems,hasIdMap map[int]string,otherChildMapSlice map[int][]*models.CygxIndustryMapItems){
+	//深度
+	depth := 0
+
+	//获取下级
+	childTree := getChildTree(tree,item)
+	depth = childTreeToSlice(childTree,hasIdMap,depth,otherChildMapSlice)
+
+	//获取上级
+	var tmpParentSlice []*models.CygxIndustryMapItems
+	tmpParentSlice,_ = parentTreeToSlice(tree,item,0,tmpParentSlice,hasIdMap)
+	//移除第一个最上级的行业(根节点)
+	tmpParentSlice = append(tmpParentSlice[:0],tmpParentSlice[1:len(tmpParentSlice)]...)
+	//切片反转
+	tmpParentSlice = reverse(tmpParentSlice)
+	for _,v := range tmpParentSlice{
+		depth++
+		if _,ok := hasIdMap[v.IndustryMapId];ok==false{
+			otherChildMapSlice[depth] = append(otherChildMapSlice[depth],v)
+		}
+	}
+
+	//获取同级
+	//fmt.Println("===============")
+	depth = siblingTreeToSlice(tree,item,hasIdMap,depth,otherChildMapSlice)
+
+	//上级的同级~
+	/*for _,parentSlice := range tmpParentSlice{
+		depth = siblingTreeToSlice(tree,parentSlice,hasIdMap,depth,otherChildMapSlice)
+	}*/
+	return
+}
+
+//获取行业图谱切片
+func GetIndustryMapNameSlice(industryName string)(nameSlice []string,err error){
+	tree,err := GetIndustryTree()
+	if err != nil{
+		fmt.Println("获取树失败")
+	}
+
+	//fmt.Println(tree)
+
+	//已经存在的行业id的map集合
+	hasIdMap := make(map[int]string)
+	itemList,err := models.GetFirstCygxIndustryListByName(industryName)
+	if err != nil{
+		fmt.Println("获取数据失败,",err)
+	}
+	//找不到对应的数据
+	if len(itemList) <= 0{
+		return
+	}
+	//for k,item := range list{
+	//	fmt.Println(k)
+	//	fmt.Println(item)
+	//}
+	//return
+	industryMapList := make(map[int][]*models.CygxIndustryMapItems)
+	for _,item := range itemList{
+		industryMapList[item.Level] = append(industryMapList[item.Level],item)
+	}
+
+	//将查出来的根节点数据的key取出来,放在切片中,并对该切片做正序排列
+	var sortIndustryList []int
+	for k, _ := range industryMapList {
+		sortIndustryList = append(sortIndustryList, k)
+	}
+	sort.Ints(sortIndustryList)
+
+	//最底层节点的数据集合
+	list := industryMapList[sortIndustryList[0]]
+
+	otherChildMapSlice := map[int][]*models.CygxIndustryMapItems{}
+	for _,item := range list{
+		hasIdMap[item.IndustryMapId]=""
+		getMap(tree,item,hasIdMap,otherChildMapSlice)
+	}
+	var tmpSlice []*models.CygxIndustryMapItems
+
+	//将其他规律数据的key取出来,放在切片中,并对该切片做正序排列
+	var sortList []int
+	for k, _ := range otherChildMapSlice {
+		sortList = append(sortList, k)
+	}
+	sort.Ints(sortList)
+
+	//遍历该切片,根据下标key获取对应的数据,并插入到主数据中
+	for _,v := range sortList{
+		tmpChildSlice := otherChildMapSlice[v]
+		randSlice(tmpChildSlice)
+		tmpSlice = append(tmpSlice,tmpChildSlice...)
+		//fmt.Println(k,"=====")
+		//for _,tmpV := range otherChildMapSlice[v]{
+		//	fmt.Println(tmpV.IndustryMapName)
+		//}
+	}
+	//名字切片
+	for _,v := range tmpSlice{
+		//fmt.Println("k===",k,"=======v=======",v)
+		nameSlice = append(nameSlice,v.IndustryMapName)
+	}
+
+	//fmt.Println(nameSlice)
+	//fmt.Println(strings.Join(nameSlice,","))
+	//utils.FileLog.Info("allNodes:%s",strings.Join(nameSlice,","))
+	return
+}
+
+//切片反转
+func reverse(s []*models.CygxIndustryMapItems) []*models.CygxIndustryMapItems {
+	for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
+		s[i], s[j] = s[j], s[i]
+	}
+	return s
+}
+
+//获取当前节点的树
+func getChildTree(rootNode *models.CygxIndustryMapItems,nowNode *models.CygxIndustryMapItems) (returnNode *models.CygxIndustryMapItems)  {
+	if rootNode.IndustryMapId == nowNode.IndustryMapId{
+		returnNode = rootNode
+		return
+	}
+	if rootNode.Children != nil{
+		for _,v := range rootNode.Children {
+			if v.IndustryMapId == nowNode.IndustryMapId{
+				returnNode = v
+			}else{
+				returnNode = getChildTree(v,nowNode)
+			}
+			if returnNode != nil{
+				return
+			}
+		}
+	}
+	return
+}
+
+//获取子树V2,与上一个子树规律不一样,因为上级
+func childTreeToSlice(rootNode *models.CygxIndustryMapItems,hasIdMap map[int]string,depth int,otherChildMapSlice map[int][]*models.CygxIndustryMapItems)(maxDepth int) {
+	if rootNode.Children != nil{
+		depth++
+		maxDepth = depth
+		for _,v := range rootNode.Children {
+			//判断是否已经录入,如果已经录入,那么不处理
+			if _,ok := hasIdMap[v.IndustryMapId];ok==false{
+				otherChildMapSlice[depth] = append(otherChildMapSlice[depth],v)
+			}
+		}
+
+		for _,v := range rootNode.Children {
+			//判断是否已经录入,如果已经录入,那么不处理
+			if _,ok := hasIdMap[v.IndustryMapId];ok==false{
+				hasIdMap[v.IndustryMapId] = ""
+				returnDepth := childTreeToSlice(v,hasIdMap,depth,otherChildMapSlice)
+				if returnDepth > maxDepth{
+					maxDepth = returnDepth
+				}
+			}
+		}
+	}
+	return maxDepth
+}
+
+//获取兄弟级树
+func siblingTreeToSlice(rootNode *models.CygxIndustryMapItems,nowNode *models.CygxIndustryMapItems,hasIdMap map[int]string,depth int,otherChildMapSlice map[int][]*models.CygxIndustryMapItems)(maxDepth int)  {
+	if rootNode.Children != nil{
+		depth++
+		maxDepth = depth
+		for _,v := range rootNode.Children {
+			//如果父级id一致的情况下,那么代表这是兄弟节点或者是自己了
+			if v.ParentId == nowNode.ParentId{
+				//判断是否已经录入,如果已经录入,那么不处理
+				if _,ok := hasIdMap[v.IndustryMapId];ok==false{
+					otherChildMapSlice[depth] = append(otherChildMapSlice[depth],v)
+					returnDepth := childTreeToSlice(v,hasIdMap,depth,otherChildMapSlice)
+					if returnDepth > maxDepth{
+						maxDepth = returnDepth
+					}
+				}
+			}else{
+				returnDepth := siblingTreeToSlice(v,nowNode,hasIdMap,depth,otherChildMapSlice)
+				if returnDepth > maxDepth{
+					maxDepth = returnDepth
+				}
+			}
+		}
+
+		for _,v := range rootNode.Children{
+			if v.ParentId == nowNode.ParentId {
+				if _,ok := hasIdMap[v.IndustryMapId];ok==false{
+					hasIdMap[v.IndustryMapId] = ""
+				}
+
+			}
+		}
+	}
+	return
+}
+
+//获取上级树
+func parentTreeToSlice(rootNode *models.CygxIndustryMapItems,nowNode *models.CygxIndustryMapItems,depth int,tmpReturnSlice []*models.CygxIndustryMapItems,hasIdMap map[int]string) (returnSlice []*models.CygxIndustryMapItems,ok bool)  {
+	if depth != 0 {
+		returnSlice = tmpReturnSlice
+	}
+	depth++
+	returnSlice = append(returnSlice,rootNode)
+	//if _,ok := hasIdMap[rootNode.IndustryMapId];ok==false{
+	//	hasIdMap[rootNode.IndustryMapId] = ""
+	//}
+	if rootNode.Children != nil{
+		for _,v := range rootNode.Children {
+			if v.ParentId == nowNode.ParentId{
+				ok = true
+				return
+			}
+			returnSlice,ok = parentTreeToSlice(v,nowNode,depth,returnSlice,hasIdMap)
+			//如果返回的匹配完成,那么不进入下一次循环,直接返回
+			if ok {
+				return
+			}
+
+			//一次循环结束后,如果没有匹配上,那么移除临时切片中的数据
+			returnSlice = append(returnSlice[:0], returnSlice[0:depth]...)
+		}
+	}
+
+	return
+}
+
+//切片乱序
+func randSlice(slice []*models.CygxIndustryMapItems) {
+	rv := reflect.ValueOf(slice)
+	if rv.Type().Kind() != reflect.Slice {
+		return
+	}
+
+	length := rv.Len()
+	if length < 2 {
+		return
+	}
+
+	swap := reflect.Swapper(slice)
+	rand.Seed(time.Now().Unix())
+	for i := length - 1; i >= 0; i-- {
+		j := rand.Intn(length)
+		swap(i, j)
+	}
+	return
+}
+//region数据修复
+func FixData(){
+	tree,err := GetIndustryTree()
+	if err != nil{
+		fmt.Println("获取树失败")
+	}
+	models.FixLevelData(tree.IndustryMapId,1)
+	fixData(tree,1)
+	return
+}
+
+func fixData(item *models.CygxIndustryMapItems,depth int)  {
+	depth++
+	if item.Children == nil{
+		return
+	}
+	for _,v := range item.Children{
+		models.FixLevelData(v.IndustryMapId,depth)
+		fixData(v,depth)
+	}
+}
+//endregion