Browse Source

新增数据导入

rdluck 4 years ago
parent
commit
54e700e734
4 changed files with 842 additions and 13 deletions
  1. 39 13
      models/article.go
  2. 1 0
      models/db.go
  3. 148 0
      services/data_import.go
  4. 654 0
      services/elasticsearch.go

+ 39 - 13
models/article.go

@@ -6,19 +6,31 @@ import (
 )
 
 type CygxArticle struct {
-	ArticleId        int       `description:"文章id"`
-	Title            string    `description:"标题"`
-	TitleEn          string    `description:"英文标题 "`
-	UpdateFrequency  string    `description:"更新周期"`
-	CreateDate       string    `description:"创建时间"`
-	PublishDate      string    `description:"发布时间"`
-	Body             string    `description:"内容"`
-	Abstract         string    `description:"摘要"`
-	CategoryName     string    `description:"一级分类"`
-	SubCategoryName  string    `description:"二级分类"`
-	InterviewTime    time.Time `description:"访谈时间"`
-	ExpertBackground string    `description:"专家背景"`
-	ExpertNumber     string    `description:"专家编号"`
+	Id               int    `orm:"column(id);pk"`
+	ArticleId        int    `description:"文章id"`
+	Title            string `description:"标题"`
+	TitleEn          string `description:"英文标题 "`
+	UpdateFrequency  string `description:"更新周期"`
+	CreateDate       string `description:"创建时间"`
+	PublishDate      string `description:"发布时间"`
+	Body             string `description:"内容"`
+	Abstract         string `description:"摘要"`
+	CategoryName     string `description:"一级分类"`
+	SubCategoryName  string `description:"二级分类"`
+	PublishStatus    int    `description:"发布状态"`
+	CategoryId       int    `description:"分类id"`
+	ExpertBackground string `description:"专家背景"`
+	ExpertNumber     string `description:"专家编号"`
+	InterviewDate    string `description:"访谈日期"`
+	Department       string `description:"作者"`
+	ArticleIdMd5     string `description:"ID,md5值"`
+}
+
+//新增文章
+func AddCygxArticle(item *CygxArticle) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
 }
 
 type HomeArticle struct {
@@ -101,3 +113,17 @@ func ModifyArticleExpert(articleId int, expertNumStr, expertContentStr, intervie
 	_, err = o.Raw(sql, expertContentStr, expertNumStr, interviewDateStr, articleId).Exec()
 	return
 }
+
+type ArticleDetailTest struct {
+	ArticleId int    `description:"报告id"`
+	Title     string `description:"标题"`
+	BodyText  string `description:"内容"`
+	Body      string `json:"-" description:"内容"`
+}
+
+func GetArticleDetailTestById(articleId int) (item *ArticleDetailTest, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_article WHERE article_id = ? `
+	err = o.Raw(sql, articleId).QueryRow(&item)
+	return
+}

+ 1 - 0
models/db.go

@@ -38,5 +38,6 @@ func init() {
 		new(Resource),
 		new(CygxApplyRecord),
 		new(CygxInterviewApply),
+		new(CygxArticle),
 	)
 }

+ 148 - 0
services/data_import.go

@@ -0,0 +1,148 @@
+package services
+
+import (
+	"fmt"
+	"github.com/PuerkitoBio/goquery"
+	"github.com/tealeg/xlsx"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"html"
+	"strconv"
+	"strings"
+	"time"
+)
+
+//上海数据同步
+func ImportData() {
+	fileName := "./temp/权益报告导入0319.xlsx"
+	xlFile, err := xlsx.OpenFile(fileName)
+	if err != nil {
+		fmt.Printf("open failed: %s\n", err)
+	}
+	for _, sheet := range xlFile.Sheet {
+		row := sheet.Rows
+		for k, v := range row {
+			if k > 0 {
+				//导入数据
+				item := new(models.CygxArticle)
+				cells := v.Cells
+				articleIdStr := cells[0].Value
+				articleIdInt, _ := strconv.Atoi(articleIdStr)
+				//判断文章是否已经存在
+				existItem, err := models.GetArticleDetailById(articleIdInt)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					fmt.Println("GetArticleDetailById Err:" + err.Error())
+					return
+				}
+				if existItem != nil && existItem.ArticleId > 0 {
+					fmt.Println("exist", articleIdInt)
+					continue
+				}
+				title := cells[1].String()
+				titleEn := cells[2].String()
+				updateFrequency := cells[3].String()
+				createDate := cells[4].String()
+				createDateParse, err := time.Parse(utils.FormatDateTime, createDate)
+				if err != nil {
+					fmt.Println("createDateParse err:", err.Error())
+					return
+				}
+				fmt.Println("createDateParse ", createDateParse)
+
+				publishDate := cells[6].String()
+				publishDate=strings.Replace(publishDate,`\`,"",-1)
+				fmt.Println("publishDate: ", publishDate)
+
+				publishDateParse, err := time.Parse(utils.FormatDateTime, publishDate)
+				if err != nil {
+					fmt.Println("publishDateParse err:", err.Error())
+					return
+				}
+				fmt.Println("publishDateParse ", publishDateParse)
+
+				body := cells[11].String()
+				abstract := cells[12].String()
+				categoryName := cells[15].String()
+				subCategoryName := cells[16].String()
+				categoryId, _ := cells[18].Int()
+
+				doc, err := goquery.NewDocumentFromReader(strings.NewReader(body))
+				if err != nil {
+					fmt.Println("create doc err:", err.Error())
+					return
+				}
+
+				var expertNumArr []string
+				var expertContentArr []string
+				var interviewDateArr []string
+
+				doc.Find("p").Each(func(i int, s *goquery.Selection) {
+					contentTxt := s.Text()
+					if strings.Contains(contentTxt, "#访谈时间:") || strings.Contains(contentTxt, "访谈时间:") {
+						interviewDate := s.Next().Text()
+						interviewDateArr = append(interviewDateArr, interviewDate)
+					}
+					if strings.Contains(contentTxt, "#专家评价") || strings.Contains(contentTxt, "专家评价") {
+						expertContent := s.Next().Text()
+						if expertContent == "" {
+							expertContent = contentTxt
+						}
+						if expertContent != "" {
+							rightIndex := strings.Index(expertContent, ")")
+							if rightIndex == 0 {
+								rightIndex = strings.Index(expertContent, ")")
+							}
+							expertNum := expertContent[:rightIndex]
+							expertNum = strings.Replace(expertNum, "(", "", -1)
+							expertNum = strings.Replace(expertNum, "(", "", -1)
+							expertNum = strings.Replace(expertNum, "专家评价", "", -1)
+							if expertNum != "" {
+								expertNumArr = append(expertNumArr, expertNum)
+								rightIndex = rightIndex
+								expertContentStr := expertContent[rightIndex:]
+								expertContentStr = strings.Replace(expertContentStr, ")", "", -1)
+								expertContentStr = strings.TrimLeft(expertContentStr, ":")
+								expertContentStr = strings.TrimRight(expertContentStr, "(推荐")
+								expertContentArr = append(expertContentArr, expertContentStr)
+							}
+						}
+					}
+				})
+				var expertNumStr, expertContentStr, interviewDateStr string
+				if len(expertNumArr) > 0 {
+					expertNumStr = expertNumArr[0]
+				}
+				if len(expertContentArr) > 0 {
+					expertContentStr = expertContentArr[0]
+				}
+
+				if len(interviewDateArr) > 0 {
+					interviewDateStr = interviewDateArr[0]
+				}
+
+				item.ArticleId = articleIdInt
+				item.Title = title
+				item.TitleEn = titleEn
+				item.UpdateFrequency = updateFrequency
+				item.CreateDate = createDateParse.Format(utils.FormatDateTime)
+				item.PublishDate = publishDateParse.Format(utils.FormatDateTime)
+				item.Body = html.EscapeString(body)
+				item.Abstract = html.EscapeString(abstract)
+				item.CategoryName = categoryName
+				item.SubCategoryName = subCategoryName
+				item.CategoryId = categoryId
+				item.PublishStatus = 1
+				item.ExpertBackground = expertContentStr
+				item.ExpertNumber = expertNumStr
+				item.InterviewDate = interviewDateStr
+				item.Department = "策略组"
+				item.ArticleIdMd5 = utils.MD5(articleIdStr)
+				_, err = models.AddCygxArticle(item)
+				if err != nil {
+					fmt.Println("AddCygxArticle Err:", err.Error())
+					return
+				}
+			}
+		}
+	}
+}

+ 654 - 0
services/elasticsearch.go

@@ -0,0 +1,654 @@
+package services
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"github.com/PuerkitoBio/goquery"
+	"github.com/olivere/elastic/v7"
+	"github.com/olivere/elastic/v7/config"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"html"
+	"log"
+	"os"
+	"strconv"
+	"strings"
+)
+
+const (
+	ES_URL      = "http://es-cn-nif227b580019rgw6.public.elasticsearch.aliyuncs.com:9200" //<1>
+	ES_USERNAME = "elastic"                                                               //<2>
+	ES_PASSWORD = "hongze@2021"                                                           //<3>
+	//Grafana pwd-> 20521bb9
+	//Grafana username-> emon
+)
+
+func SaveData() {
+	//fmt.Println("start")
+	var sniff = false //<4>
+	cfg := &config.Config{
+		URL:      ES_URL,
+		Username: ES_USERNAME,
+		Password: ES_PASSWORD,
+	}
+
+	cfg.Sniff = &sniff
+	var client, err = elastic.NewClientFromConfig(cfg)
+	if err != nil {
+		fmt.Println("NewClientFromConfig Err:" + err.Error())
+		return
+	}
+	var esIndex = "cygx_article"
+	//var esType = "article"
+	//
+	exists, err := client.IndexExists(esIndex).Do(context.Background()) //<5>
+	if err != nil {
+		fmt.Println("IndexExists Err:" + err.Error())
+		return
+	}
+	if !exists {
+		_, err = client.CreateIndex(esIndex).Do(context.Background())
+		if err != nil {
+			fmt.Println("CreateIndex Err:" + err.Error())
+			return
+		}
+	}
+
+	/*
+		3161,3190,3226,3244,3264,3285,3310,3334,3370,3397,3418,3446,3477,3497,3526,3554
+	*/
+
+	idStr := `3584,3644`
+	idArr := strings.Split(idStr, ",")
+	for _, v := range idArr {
+		id, _ := strconv.Atoi(v)
+		item, err := models.GetArticleDetailById(id)
+		if err != nil {
+			fmt.Println("GetArticleDetailById Err:" + err.Error())
+			return
+		}
+		content := html.UnescapeString(item.Body)
+		doc, err := goquery.NewDocumentFromReader(strings.NewReader(content))
+		if err != nil {
+			fmt.Println("create doc err:", err.Error())
+			return
+		}
+		bodyText := doc.Text()
+		item.BodyText = bodyText
+		//新增
+		resp, err := client.Index().Index(esIndex).Id(strconv.Itoa(item.ArticleId)).BodyJson(item).Do(context.Background())
+		if err != nil {
+			fmt.Println("insert es failed", err.Error())
+			return
+		}
+		fmt.Println(resp.Status)
+	}
+
+	/*
+
+		//根据id查询
+		searchById, err := client.Get().Index(esIndex).Type(esType).Id("3138").Do(context.Background())
+		if searchById.Found {
+			body, err := searchById.Source.MarshalJSON()
+			fmt.Println("body:",string(body))
+			fmt.Println(err)
+			//var resultType models.ArticleDetail
+			//if err := json.Unmarshal(searchById.Source,&resultType); err != nil{
+			//	log.Error(err.Error())
+			//}
+			//fmt.Printf("search by id: %#v \n",resultType)
+		}
+	*/
+
+	////查询index中所有的数据
+	//var resultType models.CygxArticle
+	//searchAll,err := client.Search(esIndex).Type(esType).Do(context.Background())
+	//for _,item := range searchAll.Each(reflect.TypeOf(resultType)) {
+	//	language := item.(models.CygxArticle)
+	//	fmt.Printf("search by index all: %#v \n",language)
+	//}
+
+	//根据检索条件查询
+
+	// boolquery := elastic.NewBoolQuery()
+
+	// boolquery.Should(elastic.NewMatchQuery("Body", "专家"))
+	// highlight := elastic.NewHighlight()
+	// highlight = highlight.Fields(elastic.NewHighlighterField("Body"))
+	// highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+
+	// var pageSize int
+	// pageSize = 20
+
+	// searchByMatch, err := client.Search(esIndex).Highlight(highlight).Size(pageSize).Query(boolquery).Do(context.Background())
+
+	// var result string
+	// if searchByMatch.Hits != nil {
+
+	// }
+	// //fmt.Println(string(result))
+
+	// utils.FileLog.Info("%s", string(result))
+
+	//var resultType models.CygxArticle
+	//for k,item := range searchByMatch.Each(reflect.TypeOf(resultType)) {
+	//	language := item.(models.CygxArticle)
+	//	fmt.Printf("search by match: %#v \n",language)
+	//
+	//	fmt.Println(k)
+	//	result,err:=json.Marshal(language)
+	//	fmt.Println(err)
+
+	//	utils.FileLog.Info("%s",string(result))
+	//}
+
+	// Perform the search request.
+	//searchByMatch, err := client.Search(esIndex).Type(esType).Query(query).From(1).Size(10).Do(context.Background())
+
+	fmt.Println("end")
+}
+
+type tracelog struct{}
+
+//实现输出
+func (tracelog) Printf(format string, v ...interface{}) {
+	fmt.Printf(format, v...)
+}
+
+func SearchByKeyWordBack02(keyWord string) (result []*models.SearchItem, err error) {
+	fmt.Println("keyWord:", keyWord)
+	pageSize := 20
+	keyWordArr, err := GetIndustryMapNameSlice(keyWord)
+	keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr)
+
+	fmt.Println(keyWordArr)
+	fmt.Println(" keyWordArr ")
+
+	if err != nil {
+		go utils.SendEmail(utils.APPNAME+" "+utils.RunMode+"异常提醒:", "GetIndustryMapNameSlice:"+err.Error(), utils.EmailSendToUsers)
+	}
+	//var sniff = false //<4>
+	//cfg := &config.Config{
+	//	URL:      ES_URL,
+	//	Username: ES_USERNAME,
+	//	Password: ES_PASSWORD,
+	//}
+	//
+	//cfg.Sniff = &sniff
+	//client, err := elastic.NewClientFromConfig(cfg)
+	errorlog := log.New(os.Stdout, "APP", log.LstdFlags)
+	file := "./eslog.log"
+	logFile, _ := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
+
+	client, err := elastic.NewClient(
+		elastic.SetURL(ES_URL),
+		elastic.SetBasicAuth(ES_USERNAME, ES_PASSWORD),
+		elastic.SetTraceLog(log.New(logFile, "ES-TRACE: ", 0)),
+		elastic.SetSniff(false), elastic.SetErrorLog(errorlog))
+
+	var esIndex = "cygx_article"
+	searchMap := make(map[int]int)
+	//boolquery := elastic.NewBoolQuery()
+	//keyWordLen := len(keyWordArr)
+	//n := keyWordLen
+	//for _, v := range keyWordArr {
+	//	keyWord = v
+	//	boost := float64(n)
+	//	fmt.Println("keyWord:", keyWord)
+	//	fmt.Println("boost:", boost)
+	//	//matchQueryList = append(matchQueryList, elastic.NewMatchQuery("Title", keyWord).Boost(boost+0.2))
+	//	//matchQueryList = append(matchQueryList, elastic.NewMatchQuery("BodyText", keyWord).Boost(boost+0.1))
+	//	q1 := elastic.NewMatchQuery("Title", keyWord)
+	//	q1 = q1.Boost(boost + 0.2)
+	//	q2 := elastic.NewMatchQuery("BodyText", keyWord)
+	//	q2 = q2.Boost(boost + 0.1)
+	//	boolquery.Should(q1, q2)
+	//	n--
+	//}
+	keyWordStr := strings.Join(keyWordArr, ",")
+
+	fmt.Println("keyWordStr ", keyWordStr)
+
+	queryString := elastic.NewQueryStringQuery(`Title:(` + keyWordStr + `) BodyText:(` + keyWordStr + `)`).Analyzer("ik_smart")
+
+	boolqueryJson, err := json.Marshal(queryString)
+	fmt.Println("err:", err)
+	fmt.Println("queryString ", string(boolqueryJson))
+
+	//boolquery.Must(elastic.NewMatchQuery("Title", keyWord), elastic.NewMatchQuery("BodyText", keyWord))
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+	request := client.Search(esIndex).Highlight(highlight).Size(pageSize).Query(queryString)
+
+	requestJson, err := json.Marshal(request)
+	fmt.Println("err:", err)
+	fmt.Println("requestJson ", string(requestJson))
+
+	searchByMatch, err := request.Do(context.Background())
+
+	//searchByMatch, err := client.Search(esIndex).Highlight(highlight).Size(pageSize).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
+			}
+		}
+	}
+	return
+}
+
+func SearchByKeyWordBack(keyWord string) (result []*models.SearchItem, err error) {
+	pageSize := 20
+	keyWordArr, err := GetIndustryMapNameSlice(keyWord)
+	if err != nil {
+		go utils.SendEmail(utils.APPNAME+" "+utils.RunMode+"异常提醒:", "GetIndustryMapNameSlice:"+err.Error(), utils.EmailSendToUsers)
+	}
+	var sniff = false //<4>
+	cfg := &config.Config{
+		URL:      ES_URL,
+		Username: ES_USERNAME,
+		Password: ES_PASSWORD,
+	}
+
+	cfg.Sniff = &sniff
+	client, err := elastic.NewClientFromConfig(cfg)
+	if err != nil {
+		return
+	}
+	var esIndex = "cygx_article"
+
+	searchMap := make(map[int]int)
+	for _, v := range keyWordArr {
+		keyWord = v
+		boolquery := elastic.NewBoolQuery()
+		boolquery.Must(elastic.NewMatchQuery("Title", keyWord), elastic.NewMatchQuery("BodyText", keyWord))
+		highlight := elastic.NewHighlight()
+		highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText"))
+		highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+		searchByMatch, err := client.Search(esIndex).Highlight(highlight).Size(pageSize).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
+				}
+			}
+		}
+	}
+	return
+}
+
+func esSearch(keyWord, categoryName string) (result []*models.SearchItem, err error) {
+	pageSize := 20
+	var sniff = false //<4>
+	cfg := &config.Config{
+		URL:      ES_URL,
+		Username: ES_USERNAME,
+		Password: ES_PASSWORD,
+	}
+
+	cfg.Sniff = &sniff
+	client, err := elastic.NewClientFromConfig(cfg)
+	if err != nil {
+		return
+	}
+	var esIndex = "cygx_article"
+
+	termsQuery := elastic.NewTermsQuery("category_name", categoryName)
+
+	boolquery := elastic.NewBoolQuery()
+	boolquery.Must(elastic.NewMatchQuery("Title", keyWord), elastic.NewMatchQuery("BodyText", keyWord))
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+	searchByMatch, err := client.Search(esIndex).Highlight(highlight).Size(pageSize).Query(termsQuery).Query(boolquery).Do(context.Background())
+
+	if err != nil {
+		return result, err
+	}
+	searchMap := make(map[int]int)
+	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
+			}
+		}
+	}
+	return
+}
+
+func RemoveDuplicatesAndEmpty(a []string) (ret []string) {
+	a_len := len(a)
+	for i := 0; i < a_len; i++ {
+		if (i > 0 && a[i-1] == a[i]) || len(a[i]) == 0 {
+			continue
+		}
+		ret = append(ret, a[i])
+	}
+	return
+}
+
+func init21123() {
+	fmt.Println("start")
+	client, err := elastic.NewClient(elastic.SetURL(ES_URL), elastic.SetBasicAuth(ES_USERNAME, ES_PASSWORD), elastic.SetSniff(false))
+	if err != nil {
+		fmt.Println("err:", err)
+	}
+	fmt.Println(client)
+	keyWordStr := "医疗器械"
+	queryString := elastic.NewQueryStringQuery(`Title:(` + keyWordStr + `)`)
+
+	boolqueryJson, err := json.Marshal(queryString)
+	fmt.Println("err:", err)
+	fmt.Println("queryString ", string(boolqueryJson))
+
+	var esIndex = "cygx_article"
+	//boolquery.Must(elastic.NewMatchQuery("Title", keyWord), elastic.NewMatchQuery("BodyText", keyWord))
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+	request := client.Search(esIndex).Highlight(highlight).Query(queryString)
+
+	requestJson, err := json.Marshal(request)
+	fmt.Println("err:", err)
+	fmt.Println("requestJson ", string(requestJson))
+
+	searchByMatch, err := request.Do(context.Background())
+
+	if searchByMatch.Hits != nil {
+
+	}
+
+	fmt.Println(searchByMatch)
+	fmt.Println("end")
+}
+
+func SearchByKeyWordQuery(keyWord string) (result []*models.SearchItem, err error) {
+	errorlog := log.New(os.Stdout, "APP", log.LstdFlags)
+	file := "./rdlucklog/eslog.log"
+	logFile, _ := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
+
+	client, err := elastic.NewClient(
+		elastic.SetURL(ES_URL),
+		elastic.SetBasicAuth(ES_USERNAME, ES_PASSWORD),
+		elastic.SetTraceLog(log.New(logFile, "ES-TRACE: ", 0)),
+		elastic.SetSniff(false), elastic.SetErrorLog(errorlog))
+
+	var esIndex = "cygx_article"
+
+	//keyWordStr := "医疗"
+	//字段相等
+	queryString := elastic.NewQueryStringQuery("Title:医疗")
+	//.Analyzer("ik_smart")
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+	request := client.Search(esIndex).Highlight(highlight).Query(queryString)
+
+	searchByMatch, err := request.Do(context.Background())
+	if err != nil {
+		fmt.Println("request.Do err:", err.Error())
+		return result, err
+	}
+	if searchByMatch.Hits != nil {
+		for _, v := range searchByMatch.Hits.Hits {
+			articleJson, _ := v.Source.MarshalJSON()
+			utils.FileLog.Info("%s", string(articleJson))
+			fmt.Println(string(articleJson))
+		}
+	}
+	return
+}
+
+func SearchByKeyWord(keyWord string) (result []*models.SearchItem, err error) {
+	fmt.Println("keyWord:", keyWord)
+	keyWord = "医药"
+	pageSize := 20
+	keyWordArr, err := GetIndustryMapNameSlice(keyWord)
+	keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr)
+
+	fmt.Println(keyWordArr)
+	fmt.Println(" keyWordArr ")
+
+	if err != nil {
+		go utils.SendEmail(utils.APPNAME+" "+utils.RunMode+"异常提醒:", "GetIndustryMapNameSlice:"+err.Error(), utils.EmailSendToUsers)
+	}
+	errorlog := log.New(os.Stdout, "APP", log.LstdFlags)
+	file := "./rdlucklog/eslog.log"
+	logFile, _ := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
+
+	client, err := elastic.NewClient(
+		elastic.SetURL(ES_URL),
+		elastic.SetBasicAuth(ES_USERNAME, ES_PASSWORD),
+		elastic.SetTraceLog(log.New(logFile, "ES-TRACE: ", 0)),
+		elastic.SetSniff(false), elastic.SetErrorLog(errorlog))
+
+	//var esIndex = "cygx_article"
+	var esIndex = "article_two"
+	searchMap := make(map[int]int)
+
+	//queryString := elastic.NewQueryStringQuery(`Title:医疗 BodyText:医疗`).Analyzer("ik_smart")
+
+	//queryTeerms:=elastic.NewTermsQuery("Title","医疗","费用")
+
+	//queryMatchPhrase:=elastic.NewMatchPhraseQuery("Title","费用")
+	//.Analyzer("ik_smart")
+	//.Analyzer("ik_smart")
+	//boolquery.Must(elastic.NewMatchQuery("Title", keyWord), elastic.NewMatchQuery("BodyText", keyWord))
+	mapping := client.GetMapping()
+	mapJson, err := json.Marshal(mapping)
+	utils.FileLog.Info("%s", string(mapJson))
+	boolquery := elastic.NewBoolQuery()
+
+	keyLen := len(keyWordArr)
+	n := float64(keyLen)
+	matchArr := make([]elastic.Query, 0)
+	for _, v := range keyWordArr {
+		if v != "" {
+			matchq1 := elastic.NewMatchQuery("Title", v).Boost(n).Analyzer("ik_smart")
+			matchq2 := elastic.NewMatchQuery("BodyText", v).Boost(n).Analyzer("ik_smart")
+			matchArr = append(matchArr, matchq1)
+			matchArr = append(matchArr, matchq2)
+		}
+		n--
+	}
+	//matchArr=append(matchArr,matchq1)
+	//matchArr=append(matchArr,matchq2)
+
+	boolquery.Should(matchArr...)
+	//boolquery.Must(elastic.NewMatchQuery("BodyText", keyWord).Boost(1).Analyzer("ik_smart"))
+
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+	//request := client.Search(esIndex).Highlight(highlight).Size(pageSize).Query(queryString)
+	request := client.Search(esIndex).Highlight(highlight).Size(pageSize).Query(boolquery)
+	searchByMatch, err := request.Do(context.Background())
+	fmt.Println(searchByMatch, err)
+	//searchByMatch, err := client.Search(esIndex).Highlight(highlight).Size(pageSize).Do(context.Background())
+	if err != nil {
+		return result, err
+	}
+	fmt.Println(searchByMatch.Status, searchByMatch.TotalHits())
+	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
+			}
+		}
+	}
+	return
+}
+
+func AddMap() {
+	errorlog := log.New(os.Stdout, "APP", log.LstdFlags)
+	file := "./rdlucklog/eslog.log"
+	logFile, _ := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
+
+	client, err := elastic.NewClient(
+		elastic.SetURL(ES_URL),
+		elastic.SetBasicAuth(ES_USERNAME, ES_PASSWORD),
+		elastic.SetTraceLog(log.New(logFile, "ES-TRACE: ", 0)),
+		elastic.SetSniff(false), elastic.SetErrorLog(errorlog))
+	if err != nil {
+		fmt.Println("NewClient Err:", err.Error())
+	}
+
+	bodyJson := `{
+  "mappings": {
+    "properties": {
+      "ArticleId": {
+        "type": "integer"
+      },
+      "Title": {
+        "type": "text",
+        "analyzer": "ik_smart"
+      },
+      "BodyText": {
+        "type": "text",
+        "analyzer": "ik_smart"
+      }
+    }
+  }
+}`
+	//var esMappingIndex = "article_mapping"
+	var esIndex = "article_two"
+
+	exists, err := client.IndexExists(esIndex).Do(context.Background()) //<5>
+	if err != nil {
+		fmt.Println("IndexExists Err:" + err.Error())
+		return
+	}
+	fmt.Println("exists:", exists)
+	if !exists {
+		_, err = client.CreateIndex(esIndex).BodyJson(bodyJson).Do(context.Background())
+		//BodyJson(bodyJson).Do(context.Background())
+		if err != nil {
+			fmt.Println("CreateIndex Err:" + err.Error())
+			return
+		}
+	}
+
+	item, err := models.GetArticleDetailTestById(3584)
+	if err != nil {
+		fmt.Println("GetArticleDetailById Err:" + err.Error())
+		return
+	}
+	content := html.UnescapeString(item.Body)
+	doc, err := goquery.NewDocumentFromReader(strings.NewReader(content))
+	if err != nil {
+		fmt.Println("create doc err:", err.Error())
+		return
+	}
+	bodyText := doc.Text()
+	item.BodyText = bodyText
+	//新增
+	resp, err := client.Index().Index(esIndex).Id(strconv.Itoa(item.ArticleId)).BodyJson(item).Do(context.Background())
+	if err != nil {
+		fmt.Println("insert es failed", err.Error())
+		return
+	}
+	fmt.Println(resp)
+	//mappping := make(map[string]interface{})
+	//mappping[esMappingIndex] = bodyJson
+	//putResult,err:=client.PutMapping().Index(esIndex).BodyJson(mappping).Do(context.Background())
+	//mapping,err := client.GetMapping().Index(esIndex).Do(context.Background())
+	//fmt.Println(mapping)
+	//mapJson, err := json.Marshal(mapping)
+	//utils.FileLog.Info("%s", string(mapJson))
+	//fmt.Println(esMappingIndex)
+	//
+	//fmt.Println(err)
+	//fmt.Println(putResult)
+}