Browse Source

新增elasticsearch

rdluck 4 years ago
parent
commit
1a51d0c5ac
3 changed files with 135 additions and 47 deletions
  1. 20 19
      controllers/search.go
  2. 71 3
      services/elastic.go
  3. 44 25
      services/task.go

+ 20 - 19
controllers/search.go

@@ -27,27 +27,28 @@ func (this *SearchController) SearchList() {
 		return
 	}
 	/*
-	user := this.User
-	if user == nil {
-		br.Msg = "请重新登录"
-		br.Ret = 408
-		return
-	}
+		user := this.User
+		if user == nil {
+			br.Msg = "请重新登录"
+			br.Ret = 408
+			return
+		}
 
-	categoryList, err := models.GetCategoryByCompanyId(user.CompanyId)
-	if err != nil {
-		br.Msg = "检索失败!"
-		br.ErrMsg = "检索分类信息失败,Err:" + err.Error()
-		return
-	}
+		categoryList, err := models.GetCategoryByCompanyId(user.CompanyId)
+		if err != nil {
+			br.Msg = "检索失败!"
+			br.ErrMsg = "检索分类信息失败,Err:" + err.Error()
+			return
+		}
 
-	var categoryNameArr []string
-	for _, v := range categoryList {
-		categoryNameArr = append(categoryNameArr, v.CategoryName)
-	}
-	categoryName := strings.Join(categoryNameArr, ",")
-	 */
-	result, err := services.SearchByKeyWord(keyWord)
+		var categoryNameArr []string
+		for _, v := range categoryList {
+			categoryNameArr = append(categoryNameArr, v.CategoryName)
+		}
+		categoryName := strings.Join(categoryNameArr, ",")
+	*/
+	indexName := "article"
+	result, err := services.EsQuery(indexName, keyWord)
 	if err != nil {
 		br.Msg = "检索失败"
 		br.ErrMsg = "检索失败,Err:" + err.Error()

+ 71 - 3
services/elastic.go

@@ -2,10 +2,13 @@ package services
 
 import (
 	"context"
+	"encoding/json"
 	"fmt"
 	"github.com/olivere/elastic/v7"
+	"hongze/hongze_cygx/models"
 	"log"
 	"os"
+	"strconv"
 )
 
 func NewClient() (client *elastic.Client, err error) {
@@ -22,7 +25,7 @@ func NewClient() (client *elastic.Client, err error) {
 
 //indexName:索引名称
 //mappingJson:表结构
-func CreateIndex(indexName, mappingJson string) (err error) {
+func EsCreateIndex(indexName, mappingJson string) (err error) {
 	client, err := NewClient()
 	if err != nil {
 		return
@@ -43,7 +46,7 @@ func CreateIndex(indexName, mappingJson string) (err error) {
 }
 
 //新增数据
-func AddData(indexName, docId string, item interface{}) (err error) {
+func EsAddData(indexName, docId string, item interface{}) (err error) {
 	client, err := NewClient()
 	if err != nil {
 		return
@@ -52,7 +55,11 @@ func AddData(indexName, docId string, item interface{}) (err error) {
 	if err != nil {
 		return
 	}
-	fmt.Println("AddData", resp.Status, resp.Result)
+	if resp.Status == 0 && resp.Result == "created" {
+		fmt.Println("新增成功")
+	} else {
+		fmt.Println("AddData", resp.Status, resp.Result)
+	}
 	return
 }
 
@@ -66,3 +73,64 @@ func MappingModify(indexName, mappingJson string) {
 	fmt.Println(result)
 	return
 }
+
+func EsQuery(indexName, keyWord string)(result []*models.SearchItem,err error) {
+	client, err := NewClient()
+	pageSize := 20
+	keyWordArr, err := GetIndustryMapNameSlice(keyWord)
+	fmt.Println(keyWordArr)
+	keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr)
+	fmt.Println("-------------------------------")
+	fmt.Println(keyWordArr)
+	searchMap := make(map[int]int)
+	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--
+	}
+
+	boolquery.Should(matchArr...)
+
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+	request := client.Search(indexName).Highlight(highlight).Size(pageSize).Query(boolquery)
+	searchByMatch, err := request.Do(context.Background())
+	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
+}

+ 44 - 25
services/task.go

@@ -90,30 +90,49 @@ func Task() {
 	//}`
 	//	CreateIndex(indexName,mappingJson)
 	//插入数据
-
-
-	type ElasticArticleDetail struct {
-		ArticleId            int    `description:"报告id"`
-		Title                string `description:"标题"`
-		TitleEn              string `description:"英文标题 "`
-		UpdateFrequency      string `description:"更新周期"`
-		CreateDate           string `description:"创建时间"`
-		PublishDate          string `description:"发布时间"`
-		Abstract             string `description:"摘要"`
-		CategoryName         string `description:"一级分类"`
-		SubCategoryName      string `description:"二级分类"`
-		IsCollect            bool   `description:"是否收藏:true,已收藏,false:未收藏"`
-		IsInterviewApply     bool   `description:"是否申请访谈:true,已申请,false:未申请"`
-		BodyText             string `description:"内容"`
-		InterviewApplyStatus string `description:"当前访谈申请状态:'待邀请','待访谈','已完成','已取消'"`
-		InterviewDate        string `description:"访谈时间"`
-		ExpertBackground     string `description:"专家背景"`
-		ExpertNumber         string `description:"专家编号"`
-		Department           string `description:"作者"`
-		SellerMobile         string `description:"销售手机号"`
-		SellerName           string `description:"销售名称"`
-		ArticleIdMd5         string `description:"纪要id"`
-	}
-
+	//allList, err := models.GetArticleAll()
+	//if err != nil {
+	//	fmt.Println("GetArticleAll Err:", err.Error())
+	//	return
+	//}
+	//
+	//indexName:="article"
+	//for _, v := range allList {
+	//	item := new(ElasticArticleDetail)
+	//	item.ArticleId = v.ArticleId
+	//	item.Title = v.Title
+	//	item.TitleEn = v.TitleEn
+	//	item.UpdateFrequency = v.UpdateFrequency
+	//	item.CreateDate = v.CreateDate
+	//	item.PublishDate = v.PublishDate
+	//	item.Abstract = v.Abstract
+	//	item.CategoryName = v.CategoryName
+	//	item.SubCategoryName = v.SubCategoryName
+	//	item.InterviewDate = v.InterviewDate
+	//	item.ExpertBackground = v.ExpertBackground
+	//	item.ExpertNumber = v.ExpertNumber
+	//	item.Department = v.Department
+	//	item.ArticleIdMd5 = v.ArticleIdMd5
+	//	item.BodyText = v.BodyText
+	//	EsAddData(indexName, strconv.Itoa(v.ArticleId), item)
+	//}
 	fmt.Println("end")
 }
+
+type ElasticArticleDetail struct {
+	ArticleId        int    `description:"报告id"`
+	Title            string `description:"标题"`
+	TitleEn          string `description:"英文标题 "`
+	UpdateFrequency  string `description:"更新周期"`
+	CreateDate       string `description:"创建时间"`
+	PublishDate      string `description:"发布时间"`
+	Abstract         string `description:"摘要"`
+	CategoryName     string `description:"一级分类"`
+	SubCategoryName  string `description:"二级分类"`
+	InterviewDate    string `description:"访谈时间"`
+	ExpertBackground string `description:"专家背景"`
+	ExpertNumber     string `description:"专家编号"`
+	Department       string `description:"作者"`
+	ArticleIdMd5     string `description:"纪要id"`
+	BodyText         string `description:"内容"`
+}