Browse Source

优化搜索

rdluck 4 years ago
parent
commit
bcb4645ee7
1 changed files with 42 additions and 36 deletions
  1. 42 36
      services/elasticsearch.go

+ 42 - 36
services/elasticsearch.go

@@ -147,7 +147,6 @@ func SaveData() {
 	fmt.Println("end")
 }
 
-
 func SearchByKeyWord(keyWord string) (result []*models.SearchItem, err error) {
 	pageSize := 20
 	keyWordArr, err := GetIndustryMapNameSlice(keyWord)
@@ -169,51 +168,58 @@ func SearchByKeyWord(keyWord string) (result []*models.SearchItem, err error) {
 	var esIndex = "cygx_article"
 
 	searchMap := make(map[int]int)
+	boolquery := elastic.NewBoolQuery()
+	matchQueryList := make([]elastic.Query, len(keyWordArr))
+	keyWordLen := len(keyWordArr)
+	n := keyWordLen
 	for _, v := range keyWordArr {
 		keyWord = v
-		boolquery := elastic.NewBoolQuery()
-		boolquery.Must(elastic.NewMatchQuery("Title", keyWord), elastic.NewMatchQuery("BodyText", keyWord))
+		boost := float64(n)
+		matchQueryList = append(matchQueryList, elastic.NewMatchQuery("Title", keyWord).Boost(boost+0.2))
+		matchQueryList = append(matchQueryList, elastic.NewMatchQuery("BodyText", keyWord).Boost(boost+0.1))
+		n--
+	}
+	//boolquery.Must(elastic.NewMatchQuery("Title", keyWord), elastic.NewMatchQuery("BodyText", keyWord))
+	boolquery.Must(matchQueryList...)
 
-		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
+	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 SearchByKeyWordBack(keyWord string) (result []*models.SearchItem, err error) {
 	pageSize := 20
 	keyWordArr, err := GetIndustryMapNameSlice(keyWord)