package services import ( "context" "encoding/json" "fmt" "github.com/olivere/elastic/v7" "hongze/hongze_cygx/models" "hongze/hongze_cygx/utils" "sort" "strconv" "strings" ) func NewClient() (client *elastic.Client, err error) { //errorlog := log.New(os.Stdout, "APP", log.LstdFlags) //file := "" //if utils.RunMode == "release" { // //file = `/data/rdlucklog/hongze_cygx/eslog.log` // file = `./rdlucklog/eslog.log` //} else { // 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)) client, err = elastic.NewClient( elastic.SetURL(ES_URL), elastic.SetBasicAuth(ES_USERNAME, ES_PASSWORD), elastic.SetSniff(false)) return } //indexName:索引名称 //mappingJson:表结构 func EsCreateIndex(indexName, mappingJson string) (err error) { client := utils.Client //if err != nil { // return //} //定义表结构 exists, err := client.IndexExists(indexName).Do(context.Background()) //<5> if err != nil { return } if !exists { resp, err := client.CreateIndex(indexName).BodyJson(mappingJson).Do(context.Background()) //BodyJson(bodyJson).Do(context.Background()) if err != nil { fmt.Println("CreateIndex Err:" + err.Error()) return err } fmt.Println(resp.Index, resp.ShardsAcknowledged, resp.Acknowledged) } else { fmt.Println(indexName + " 已存在") } return } //新增和修改数据 func EsAddOrEditData(indexName, docId string, item *ElasticTestArticleDetail) (err error) { defer func() { if err != nil { fmt.Println("EsAddOrEditData Err:", err.Error()) } }() client := utils.Client searchById, err := client.Get().Index(indexName).Id(docId).Do(context.Background()) if err != nil && !strings.Contains(err.Error(), "404") { fmt.Println("Get Err" + err.Error()) return } if searchById != nil && searchById.Found { resp, err := client.Update().Index(indexName).Id(docId).Doc(map[string]interface{}{ "BodyText": item.BodyText, "Title": item.Title, "PublishDate": item.PublishDate, "CategoryId": item.CategoryId, "ExpertBackground": item.ExpertBackground, }).Do(context.Background()) if err != nil { return err } if resp.Status == 0 { fmt.Println("修改成功") } else { fmt.Println("EditData", resp.Status, resp.Result) } client.CloseIndex(indexName) } else { resp, err := client.Index().Index(indexName).Id(docId).BodyJson(item).Do(context.Background()) if err != nil { fmt.Println("新增失败:", err.Error()) return err } if resp.Status == 0 && resp.Result == "created" { fmt.Println("新增成功") err = nil } else { fmt.Println("AddData", resp.Status, resp.Result) } } return } //新增和修改数据 func EsAddOrEditDataV4(indexName, docId string, item *ElasticTestArticleDetailV4) (err error) { defer func() { if err != nil { fmt.Println("EsAddOrEditData Err:", err.Error()) } }() client := utils.Client //if err != nil { // return //} searchById, err := client.Get().Index(indexName).Id(docId).Do(context.Background()) if err != nil && !strings.Contains(err.Error(), "404") { fmt.Println("Get Err" + err.Error()) return } if searchById != nil && searchById.Found { resp, err := client.Update().Index(indexName).Id(docId).Doc(map[string]interface{}{ "BodyText": item.BodyText, "Title": item.Title, "PublishDate": item.PublishDate, "IsSummary": item.IsSummary, "IsReport": item.IsReport, }).Do(context.Background()) if err != nil { return err } fmt.Println(resp.Status, resp.Result) if resp.Status == 0 { fmt.Println("修改成功") } else { fmt.Println("EditData", resp.Status, resp.Result) } } else { resp, err := client.Index().Index(indexName).Id(docId).BodyJson(item).Do(context.Background()) if err != nil { fmt.Println("新增失败:", err.Error()) return err } if resp.Status == 0 && resp.Result == "created" { fmt.Println("新增成功") err = nil } else { fmt.Println("AddData", resp.Status, resp.Result) } } return } //删除数据 func EsDeleteData(indexName, docId string) (err error) { client := utils.Client //if err != nil { // return //} resp, err := client.Delete().Index(indexName).Id(docId).Do(context.Background()) if err != nil { return } if resp.Status == 0 { fmt.Println("删除成功") } else { fmt.Println("AddData", resp.Status, resp.Result) } return } func MappingModify(indexName, mappingJson string) { client := utils.Client //if err != nil { // return //} result, err := client.PutMapping().Index(indexName).BodyString(mappingJson).Do(context.Background()) fmt.Println(err) fmt.Println(result) return } func EsMatchQuery(indexName, keyWord string) (result []*models.SearchItem, err error) { client := utils.Client pageSize := 20 keyWordArr, err := GetIndustryMapNameSliceV2(keyWord) fmt.Println(keyWordArr) keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr) fmt.Println("-------------------------------") fmt.Println(keyWordArr) searchMap := make(map[int]int) boolquery := elastic.NewBoolQuery() keyLen := len(keyWordArr) n := 5.0 * float64(keyLen) matchArr := make([]elastic.Query, 0) // //matchq1 := elastic.NewMatchQuery("Title", keyWord).Boost(n + 1).Analyzer("ik_smart") //matchq2 := elastic.NewMatchQuery("BodyText", keyWord).Boost(n + 1).Analyzer("ik_smart") // //matchArr = append(matchArr, matchq1) //matchArr = append(matchArr, matchq2) 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 = n - 5 } boolquery.Should(matchArr...) highlight := elastic.NewHighlight() highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText")) highlight = highlight.PreTags("").PostTags("") 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) if len(v.Highlight["BodyText"]) > 0 { searchItem.Body = v.Highlight["BodyText"] } else { bodyRune := []rune(article.BodyText) bodyRuneLen := len(bodyRune) if bodyRuneLen > 100 { bodyRuneLen = 100 } body := string(bodyRune[:bodyRuneLen]) fmt.Println(body) searchItem.Body = []string{body} } 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 EsMatchPhraseQuery(indexName, keyWord string) (result []*models.SearchItem, err error) { client := utils.Client pageSize := 20 keyWordArr, err := GetIndustryMapNameSliceV2(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) //matchq1 := elastic.NewMatchQuery("Title", keyWord).Boost(n + 1).Analyzer("ik_smart") //matchq2 := elastic.NewMatchQuery("BodyText", keyWord).Boost(n + 1).Analyzer("ik_smart") matchq1 := elastic.NewMatchPhraseQuery("Title", keyWord) //.Analyzer("ik_smart") matchq2 := elastic.NewMatchPhraseQuery("BodyText", keyWord) matchArr = append(matchArr, matchq1) matchArr = append(matchArr, matchq2) //matchArr = append(matchArr, matchq2) //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...) boolquery.Should(matchArr...) highlight := elastic.NewHighlight() highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText")) highlight = highlight.PreTags("").PostTags("") request := client.Search(indexName).Highlight(highlight).Size(pageSize).Query(boolquery) searchByMatch, err := request.Do(context.Background()) fmt.Println("err:", err, searchByMatch) 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 } 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 EsMatchFunctionScoreQuery(indexName, keyWord string, startSize, pageSize int) (result []*models.SearchItem, total int64, err error) { client := utils.Client keyWordArr, err := GetIndustryMapNameSliceV2(keyWord) fmt.Println(keyWordArr) keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr) fmt.Println("-------------------------------") fmt.Println(keyWordArr) searchMap := make(map[int]int) boolquery := elastic.NewBoolQuery() matchArr := make([]elastic.Query, 0) // //matchq1 := elastic.NewMatchQuery("Title", keyWord).Boost(n + 1).Analyzer("ik_smart") //matchq2 := elastic.NewMatchQuery("BodyText", keyWord).Boost(n + 1).Analyzer("ik_smart") // //matchArr = append(matchArr, matchq1) //matchArr = append(matchArr, matchq2) n := 0 keyWordLen := len(keyWordArr) if keyWordLen <= 0 { keyWordArr = append(keyWordArr, keyWord) keyWordLen = len(keyWordArr) } keyWordWeight := GetWeight(keyWordLen) fmt.Println(keyWordArr) fmt.Println(keyWordWeight) for k, v := range keyWordArr { if v != "" { weight := float64(keyWordWeight[k]) titleMatchq := elastic.NewMatchQuery("Title", v).Analyzer("ik_smart") bodyMatchq := elastic.NewMatchQuery("BodyText", v).Analyzer("ik_smart") titleFunctionQuery := elastic.NewFunctionScoreQuery() titleFunctionQuery.Query(titleMatchq) titleFunctions := elastic.NewWeightFactorFunction(weight) titleFunctionQuery.AddScoreFunc(titleFunctions) titleFunctionQuery.BoostMode("replace") bodyFunctionQuery := elastic.NewFunctionScoreQuery() bodyFunctionQuery.Query(bodyMatchq) bodyFunctions := elastic.NewWeightFactorFunction(weight) bodyFunctionQuery.AddScoreFunc(bodyFunctions) bodyFunctionQuery.BoostMode("replace") matchArr = append(matchArr, titleFunctionQuery) matchArr = append(matchArr, bodyFunctionQuery) } n++ } boolquery.Should(matchArr...) highlight := elastic.NewHighlight() highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText")) highlight = highlight.PreTags("").PostTags("") request := client.Search(indexName).Highlight(highlight).From(startSize).Size(pageSize).Query(boolquery) searchByMatch, err := request.Do(context.Background()) //searchJson, err := json.Marshal(searchByMatch) if searchByMatch != nil { if searchByMatch.Hits != nil { for _, v := range searchByMatch.Hits.Hits { articleJson, err := v.Source.MarshalJSON() if err != nil { return nil, 0, err } article := new(models.CygxArticle) err = json.Unmarshal(articleJson, &article) if err != nil { return nil, 0, err } if _, ok := searchMap[article.ArticleId]; !ok { searchItem := new(models.SearchItem) searchItem.ArticleId, _ = strconv.Atoi(v.Id) if len(v.Highlight["BodyText"]) > 0 { searchItem.Body = v.Highlight["BodyText"] } else { bodyRune := []rune(article.BodyText) bodyRuneLen := len(bodyRune) if bodyRuneLen > 100 { bodyRuneLen = 100 } body := string(bodyRune[:bodyRuneLen]) fmt.Println(body) searchItem.Body = []string{body} } 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 } } } } total = searchByMatch.Hits.TotalHits.Value return } func EsMultiMatchFunctionScoreQuery(indexName, keyWord string, startSize, pageSize, userId int) (result []*models.SearchItem, total int64, err error) { client := utils.Client keyWordArr, err := GetIndustryMapNameSliceV3(keyWord) keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr) //artidArr := make([]elastic.Query, 0) //matchArr := make([]elastic.Query, 0) n := 0 keyWordLen := len(keyWordArr) if keyWordLen <= 0 { keyWordArr = append(keyWordArr, keyWord) keyWordLen = len(keyWordArr) } utils.FileLog.Info("SearchKeyWord:%s, userId:%s", keyWordArr, strconv.Itoa(userId)) //keyWordWeight := GetWeight(keyWordLen) for _, v := range keyWordArr { if v != "" { matchArr := make([]elastic.Query, 0) boolquery := elastic.NewBoolQuery() //weight := float64(keyWordWeight[k]) //multiMatch := elastic.NewMultiMatchQuery(v, "Title", "BodyText").Analyzer("ik_smart") //bodyFunctionQuery := elastic.NewFunctionScoreQuery() //bodyFunctionQuery.Query(multiMatch) //bodyFunctions := elastic.NewWeightFactorFunction(weight) //bodyFunctionQuery.AddScoreFunc(bodyFunctions) //bodyFunctionQuery.BoostMode("replace") //matchArr = append(matchArr, bodyFunctionQuery) //weight := float64(keyWordWeight[k]) multiMatch := elastic.NewMultiMatchQuery(v, "Title", "BodyText").Analyzer("ik_smart") bodyFunctionQuery := elastic.NewFunctionScoreQuery() bodyFunctionQuery.Query(multiMatch) //bodyFunctions := elastic.NewWeightFactorFunction(weight) //bodyFunctionQuery.AddScoreFunc(bodyFunctions) //bodyFunctionQuery.BoostMode("replace") matchArr = append(matchArr, bodyFunctionQuery) boolquery.Should(matchArr...) highlight := elastic.NewHighlight() highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText")) highlight = highlight.PreTags("").PostTags("") request := client.Search(indexName).Highlight(highlight).From(startSize).Size(pageSize).Query(boolquery) searchByMatch, err := request.Do(context.Background()) if err != nil { return nil, 0, err } if searchByMatch != nil { if searchByMatch.Hits != nil { for _, v := range searchByMatch.Hits.Hits { var isAppend bool articleJson, err := v.Source.MarshalJSON() if err != nil { return nil, 0, err } article := new(models.CygxArticle) err = json.Unmarshal(articleJson, &article) if err != nil { return nil, 0, err } searchItem := new(models.SearchItem) searchItem.ArticleId, _ = strconv.Atoi(v.Id) if len(v.Highlight["BodyText"]) > 0 { searchItem.Body = v.Highlight["BodyText"] } else { bodyRune := []rune(article.BodyText) bodyRuneLen := len(bodyRune) if bodyRuneLen > 100 { bodyRuneLen = 100 } body := string(bodyRune[:bodyRuneLen]) searchItem.Body = []string{body} } 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 for _, v_result := range result { if v_result.ArticleId == searchItem.ArticleId { isAppend = true } } if !isAppend { result = append(result, searchItem) } } } //total += searchByMatch.Hits.TotalHits.Value } } n++ } total = int64(len(result)) //fmt.Println(result) //boolquery.Should(matchArr...) //highlight := elastic.NewHighlight() //highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText")) //highlight = highlight.PreTags("").PostTags("") //request := client.Search(indexName).Highlight(highlight).From(startSize).Size(pageSize).Query(boolquery) //searchByMatch, err := request.Do(context.Background()) //if searchByMatch != nil { // if searchByMatch.Hits != nil { // for _, v := range searchByMatch.Hits.Hits { // articleJson, err := v.Source.MarshalJSON() // if err != nil { // return nil, 0, err // } // article := new(models.CygxArticle) // err = json.Unmarshal(articleJson, &article) // if err != nil { // return nil, 0, err // } // searchItem := new(models.SearchItem) // searchItem.ArticleId, _ = strconv.Atoi(v.Id) // if len(v.Highlight["BodyText"]) > 0 { // searchItem.Body = v.Highlight["BodyText"] // } else { // bodyRune := []rune(article.BodyText) // bodyRuneLen := len(bodyRune) // if bodyRuneLen > 100 { // bodyRuneLen = 100 // } // body := string(bodyRune[:bodyRuneLen]) // searchItem.Body = []string{body} // } // 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) // } // } // total = searchByMatch.Hits.TotalHits.Value //} return } func EsMultiMatchFunctionScoreQueryFix(indexName, keyWord string, startSize, pageSize int) (result []*models.SearchItem, total int64, err error) { client := utils.Client keyWordArr, err := GetIndustryMapNameSliceV2(keyWord) keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr) boolquery := elastic.NewBoolQuery() matchArr := make([]elastic.Query, 0) n := 0 keyWordLen := len(keyWordArr) if keyWordLen <= 0 { keyWordArr = append(keyWordArr, keyWord) keyWordLen = len(keyWordArr) } fmt.Println(keyWordArr) keyWordWeight := GetWeight(keyWordLen) for k, v := range keyWordArr { if v != "" { weight := float64(keyWordWeight[k]) multiMatch := elastic.NewMultiMatchQuery(v, "Title", "BodyText").Analyzer("ik_smart") bodyFunctionQuery := elastic.NewFunctionScoreQuery() bodyFunctionQuery.Query(multiMatch) bodyFunctions := elastic.NewWeightFactorFunction(weight) bodyFunctionQuery.AddScoreFunc(bodyFunctions) bodyFunctionQuery.BoostMode("replace") matchArr = append(matchArr, bodyFunctionQuery) } n++ } boolquery.Should(matchArr...) highlight := elastic.NewHighlight() highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText")) highlight = highlight.PreTags("").PostTags("") request := client.Search(indexName).Highlight(highlight).From(startSize).Size(pageSize).Query(boolquery) searchByMatch, err := request.Do(context.Background()) if searchByMatch != nil { matchResult, _ := json.Marshal(searchByMatch) utils.FileLog.Info("%s", string(matchResult)) if searchByMatch.Hits != nil { for _, v := range searchByMatch.Hits.Hits { articleJson, err := v.Source.MarshalJSON() utils.FileLog.Info("%s", string(articleJson)) if err != nil { return nil, 0, err } article := new(models.CygxArticle) err = json.Unmarshal(articleJson, &article) if err != nil { return nil, 0, err } searchItem := new(models.SearchItem) searchItem.ArticleId, _ = strconv.Atoi(v.Id) if len(v.Highlight["BodyText"]) > 0 { searchItem.Body = v.Highlight["BodyText"] } else { bodyRune := []rune(article.BodyText) bodyRuneLen := len(bodyRune) if bodyRuneLen > 100 { bodyRuneLen = 100 } body := string(bodyRune[:bodyRuneLen]) searchItem.Body = []string{body} } 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) } } total = searchByMatch.Hits.TotalHits.Value } return } func GetWeight(length int) []int { steep := 10 intArr := make([]int, 0) for i := 1; i <= length; i++ { if i == 1 { intArr = append(intArr, 1) } else { min := GetArrSum(intArr) maxVal := utils.GetRandInt(min, min+steep) intArr = append(intArr, maxVal) } } //数组排序 sort.Slice(intArr, func(i, j int) bool { return intArr[i] > intArr[j] }) return intArr } func GetArrSum(intArr []int) (sum int) { for _, val := range intArr { //累计求和 sum += val } return } //func init() { // fmt.Println("start") // keyWord:="阿里巴巴" // keyWordArr, _ := GetIndustryMapNameSliceV2(keyWord) // keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr) // fmt.Println(keyWordArr) // fmt.Println("end") //} func EsMultiMatchFunctionScoreQuerySort(indexName, keyWord string, startSize, pageSize, userId int, orderColumn string) (result []*models.SearchItem, total int64, err error) { client := utils.Client keyWordArr, err := GetIndustryMapNameSliceV3(keyWord) keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr) //artidArr := make([]elastic.Query, 0) //matchArr := make([]elastic.Query, 0) n := 0 keyWordLen := len(keyWordArr) if keyWordLen <= 0 { keyWordArr = append(keyWordArr, keyWord) keyWordLen = len(keyWordArr) } // @Param OrderColumn query int true "排序字段 ,Comprehensive综合 ,Matching匹配度 ,PublishDate 发布时间 " utils.FileLog.Info("SearchKeyWord:%s, userId:%s", keyWordArr, strconv.Itoa(userId)) //keyWordWeight := GetWeight(keyWordLen) for _, v := range keyWordArr { if v != "" { matchArr := make([]elastic.Query, 0) boolquery := elastic.NewBoolQuery() bodyFunctionQuery := elastic.NewFunctionScoreQuery() bodyFunctionQuery2 := elastic.NewFunctionScoreQuery() bodyFunctionQuery3 := elastic.NewFunctionScoreQuery() //multiMatch := elastic.NewMultiMatchQuery(v, "Title", "BodyText").Analyzer("ik_smart") multiMatch := elastic.NewMultiMatchQuery(v, "Title").Analyzer("ik_smart").Boost(100) bodyFunctionQuery.Query(multiMatch) matchArr = append(matchArr, bodyFunctionQuery) multiMatch = elastic.NewMultiMatchQuery(v, "BodyText").Analyzer("ik_smart").Boost(1) bodyFunctionQuery2.Query(multiMatch) matchArr = append(matchArr, bodyFunctionQuery2) //multiMatch = elastic.NewMultiMatchQuery(1, "IsSummary") bodyFunctionQuery3.Query(multiMatch) matchArr = append(matchArr, bodyFunctionQuery3) boolquery.Should(matchArr...) //multiMatch = elastic.NewMultiMatchQuery(v, "BodyText").Analyzer("ik_smart") //bodyFunctionQuery.Query(multiMatch) //matchArr = append(matchArr, bodyFunctionQuery) //boolquery.Should(matchArr...) highlight := elastic.NewHighlight() highlight = highlight.PreTags("").PostTags("") highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText")) request := client.Search(indexName).Highlight(highlight).Sort("PublishDate", false).From(0).Size(pageSize).Query(boolquery) if orderColumn == "Matching" { request = client.Search(indexName).Highlight(highlight).From(0).Size(pageSize).Query(boolquery) } searchByMatch, err := request.Do(context.Background()) if err != nil { return nil, 0, err } if searchByMatch != nil { if searchByMatch.Hits != nil { for _, v := range searchByMatch.Hits.Hits { var isAppend bool articleJson, err := v.Source.MarshalJSON() if err != nil { return nil, 0, err } article := new(models.CygxArticleEs) err = json.Unmarshal(articleJson, &article) if err != nil { return nil, 0, err } searchItem := new(models.SearchItem) searchItem.ArticleId, _ = strconv.Atoi(v.Id) if len(v.Highlight["BodyText"]) > 0 { searchItem.Body = v.Highlight["BodyText"] } else { bodyRune := []rune(article.BodyText) bodyRuneLen := len(bodyRune) if bodyRuneLen > 100 { bodyRuneLen = 100 } body := string(bodyRune[:bodyRuneLen]) searchItem.Body = []string{body} } 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 searchItem.ExpertBackground = article.ExpertBackground searchItem.CategoryId = article.CategoryId for _, v_result := range result { if v_result.ArticleId == searchItem.ArticleId { isAppend = true } } if !isAppend { result = append(result, searchItem) } } } //total += searchByMatch.Hits.TotalHits.Value } } n++ } total = int64(len(result)) return } func EsMultiMatchFunctionScoreQueryTimeSort(indexName, keyWord string, startSize, pageSize, userId int) (result []*models.SearchItem, total int64, err error) { client := utils.Client keyWordArr, err := GetIndustryMapNameSliceV2(keyWord) keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr) boolquery := elastic.NewBoolQuery() matchArr := make([]elastic.Query, 0) //matchArr2 := make([]elastic.Query, 0) n := 0 keyWordLen := len(keyWordArr) if keyWordLen <= 0 { keyWordArr = append(keyWordArr, keyWord) keyWordLen = len(keyWordArr) } utils.FileLog.Info("SearchKeyWord:%s, userId:%s", keyWordArr, strconv.Itoa(userId)) for _, v := range keyWordArr { if v != "" { multiMatch := elastic.NewMultiMatchQuery(v, "Title", "BodyText") bodyFunctionQuery := elastic.NewFunctionScoreQuery() bodyFunctionQuery.Query(multiMatch) matchArr = append(matchArr, bodyFunctionQuery) } n++ } boolquery.Should(matchArr...) highlight := elastic.NewHighlight() highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText")) highlight = highlight.PreTags("").PostTags("") request := client.Search(indexName).Highlight(highlight).Sort("PublishDate", false).Size(pageSize).Query(boolquery) searchByMatch, err := request.Do(context.Background()) if searchByMatch != nil { matchResult, _ := json.Marshal(searchByMatch) utils.FileLog.Info("%s", string(matchResult)) fmt.Println(len(searchByMatch.Hits.Hits)) if searchByMatch.Hits != nil { for _, v := range searchByMatch.Hits.Hits { articleJson, err := v.Source.MarshalJSON() utils.FileLog.Info("%s", string(articleJson)) if err != nil { return nil, 0, err } article := new(models.CygxArticleEs) err = json.Unmarshal(articleJson, &article) if err != nil { return nil, 0, err } searchItem := new(models.SearchItem) searchItem.ArticleId, _ = strconv.Atoi(v.Id) if len(v.Highlight["BodyText"]) > 0 { searchItem.Body = v.Highlight["BodyText"] } else { bodyRune := []rune(article.BodyText) bodyRuneLen := len(bodyRune) if bodyRuneLen > 100 { bodyRuneLen = 100 } body := string(bodyRune[:bodyRuneLen]) searchItem.Body = []string{body} } 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 searchItem.ExpertBackground = article.ExpertBackground searchItem.CategoryId = article.CategoryId result = append(result, searchItem) } } total = searchByMatch.Hits.TotalHits.Value } return } func EsSearchReport(indexName, keyWord string, startSize, pageSize, userId int) (result []*models.SearchItem, total int64, err error) { client := utils.Client keyWordArr, err := GetIndustryMapNameSliceV3(keyWord) keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr) n := 0 keyWordLen := len(keyWordArr) if keyWordLen <= 0 { keyWordArr = append(keyWordArr, keyWord) keyWordLen = len(keyWordArr) } for _, v := range keyWordArr { fmt.Println(v) } utils.FileLog.Info("SearchKeyWord:%s, userId:%s", keyWordArr, strconv.Itoa(userId)) for _, v := range keyWordArr { if v != "" { matchArr := make([]elastic.Query, 0) boolquery := elastic.NewBoolQuery() bodyFunctionQuery := elastic.NewFunctionScoreQuery() bodyFunctionQuery2 := elastic.NewFunctionScoreQuery() multiMatch := elastic.NewMultiMatchQuery(v, "Title").Analyzer("ik_smart") bodyFunctionQuery.Query(multiMatch) matchArr = append(matchArr, bodyFunctionQuery) multiMatch = elastic.NewMultiMatchQuery(1, "IsReport") bodyFunctionQuery2.Query(multiMatch) matchArr = append(matchArr, bodyFunctionQuery2) boolquery.Must(matchArr...) highlight := elastic.NewHighlight() highlight = highlight.PreTags("").PostTags("") highlight = highlight.Fields(elastic.NewHighlighterField("Title")) request := client.Search(indexName).Highlight(highlight).Sort("PublishDate", false).From(0).Size(pageSize).Query(boolquery) searchByMatch, err := request.Do(context.Background()) if err != nil { return nil, 0, err } if searchByMatch != nil { if searchByMatch.Hits != nil { for _, v := range searchByMatch.Hits.Hits { var isAppend bool articleJson, err := v.Source.MarshalJSON() if err != nil { return nil, 0, err } article := new(models.CygxArticleEs) err = json.Unmarshal(articleJson, &article) if err != nil { return nil, 0, err } searchItem := new(models.SearchItem) searchItem.ArticleId, _ = strconv.Atoi(v.Id) 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 for _, v_result := range result { if v_result.ArticleId == searchItem.ArticleId { isAppend = true } } if !isAppend { result = append(result, searchItem) } } } } } n++ } total = int64(len(result)) return } //分页 func EsMultiMatchFunctionScoreQueryTimeSortPage(indexName, keyWord string, startSize, pageSize, userId int) (result []*models.SearchItem, total int64, err error) { client := utils.Client keyWordArr, err := GetIndustryMapNameSliceV2(keyWord) keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr) boolquery := elastic.NewBoolQuery() matchArr := make([]elastic.Query, 0) n := 0 keyWordLen := len(keyWordArr) if keyWordLen <= 0 { keyWordArr = append(keyWordArr, keyWord) keyWordLen = len(keyWordArr) } for _, v := range keyWordArr { if v != "" { multiMatch := elastic.NewMultiMatchQuery(v, "Title", "BodyText") bodyFunctionQuery := elastic.NewFunctionScoreQuery() bodyFunctionQuery.Query(multiMatch) matchArr = append(matchArr, bodyFunctionQuery) } n++ } boolquery.Should(matchArr...) highlight := elastic.NewHighlight() highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText")) highlight = highlight.PreTags("").PostTags("") request := client.Search(indexName).Highlight(highlight).Sort("PublishDate", false).From(startSize).Size(pageSize).Query(boolquery) searchByMatch, err := request.Do(context.Background()) if searchByMatch != nil { if searchByMatch.Hits != nil { for _, v := range searchByMatch.Hits.Hits { articleJson, err := v.Source.MarshalJSON() if err != nil { return nil, 0, err } article := new(models.CygxArticleEs) err = json.Unmarshal(articleJson, &article) if err != nil { return nil, 0, err } searchItem := new(models.SearchItem) searchItem.ArticleId, _ = strconv.Atoi(v.Id) if len(v.Highlight["BodyText"]) > 0 { searchItem.Body = v.Highlight["BodyText"] } else { bodyRune := []rune(article.BodyText) bodyRuneLen := len(bodyRune) if bodyRuneLen > 100 { bodyRuneLen = 100 } body := string(bodyRune[:bodyRuneLen]) searchItem.Body = []string{body} } 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 searchItem.ExpertBackground = article.ExpertBackground searchItem.CategoryId = article.CategoryId result = append(result, searchItem) } } total = searchByMatch.Hits.TotalHits.Value } return } func EsMultiMatchFunctionScoreQuerySortPage(indexName, keyWord string, startSize, pageSize, userId int, orderColumn string) (result []*models.SearchItem, total int64, err error) { client := utils.Client keyWordArr, err := GetIndustryMapNameSliceV3(keyWord) keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr) keyWordLen := len(keyWordArr) if keyWordLen <= 0 { keyWordArr = append(keyWordArr, keyWord) keyWordLen = len(keyWordArr) } var keyWords string for _, v := range keyWordArr { keyWords += v + " " } // @Param OrderColumn query int true "排序字段 ,Comprehensive综合 ,Matching匹配度 ,PublishDate 发布时间 " //keyWordWeight := GetWeight(keyWordLen) matchArr := make([]elastic.Query, 0) boolquery := elastic.NewBoolQuery() bodyFunctionQuery := elastic.NewFunctionScoreQuery() bodyFunctionQuery2 := elastic.NewFunctionScoreQuery() bodyFunctionQuery3 := elastic.NewFunctionScoreQuery() multiMatch := elastic.NewMultiMatchQuery(keyWords, "Title").Analyzer("ik_smart").Boost(100) bodyFunctionQuery.Query(multiMatch) matchArr = append(matchArr, bodyFunctionQuery) multiMatch = elastic.NewMultiMatchQuery(keyWords, "BodyText").Analyzer("ik_smart").Boost(1) bodyFunctionQuery2.Query(multiMatch) matchArr = append(matchArr, bodyFunctionQuery2) bodyFunctionQuery3.Query(multiMatch) matchArr = append(matchArr, bodyFunctionQuery3) boolquery.Should(matchArr...) highlight := elastic.NewHighlight() highlight = highlight.PreTags("").PostTags("") highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText")) request := client.Search(indexName).Highlight(highlight).Sort("PublishDate", false).From(startSize).Size(pageSize).Query(boolquery) if orderColumn == "Matching" { request = client.Search(indexName).Highlight(highlight).From(startSize).Size(pageSize).Query(boolquery) } searchByMatch, err := request.Do(context.Background()) if err != nil { return nil, 0, err } if searchByMatch != nil { if searchByMatch.Hits != nil { for _, v := range searchByMatch.Hits.Hits { var isAppend bool articleJson, err := v.Source.MarshalJSON() if err != nil { return nil, 0, err } article := new(models.CygxArticleEs) err = json.Unmarshal(articleJson, &article) if err != nil { return nil, 0, err } searchItem := new(models.SearchItem) searchItem.ArticleId, _ = strconv.Atoi(v.Id) if len(v.Highlight["BodyText"]) > 0 { searchItem.Body = v.Highlight["BodyText"] } else { bodyRune := []rune(article.BodyText) bodyRuneLen := len(bodyRune) if bodyRuneLen > 100 { bodyRuneLen = 100 } body := string(bodyRune[:bodyRuneLen]) searchItem.Body = []string{body} } 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 searchItem.ExpertBackground = article.ExpertBackground searchItem.CategoryId = article.CategoryId for _, v_result := range result { if v_result.ArticleId == searchItem.ArticleId { isAppend = true } } if !isAppend { result = append(result, searchItem) } } } } total += searchByMatch.Hits.TotalHits.Value return }