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("").PostTags("") // 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("").PostTags("") 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(indexName, keyWord string, startSize, pageSize, userId int) (result []*models.SearchItem, total int, err error) { 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 = indexName 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("").PostTags("") searchByMatch, err := client.Search(esIndex).Highlight(highlight).Size(pageSize).Query(boolquery).Do(context.Background()) if err != nil { return result, 0, err } 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) 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("").PostTags("") 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 } // KeyWordArrSqlRegexp 预处理ik联想词的模糊查询语句 func KeyWordArrSqlRegexp(a []string) (ret string) { a_len := len(a) for i := 0; i < a_len; i++ { if i == 0 { continue } ret += a[i] + "|" } ret = strings.TrimRight(ret, "|") return } // KeyWordArrSqlRegexp 预处理ik联想词的模糊查询语句 func KeyWordArrSqlRegexpAll(a []string) (ret string) { a_len := len(a) for i := 0; i < a_len; i++ { ret += a[i] + "|" } ret = strings.TrimRight(ret, "|") //ret = "'" + ret + "'" 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("").PostTags("") 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("").PostTags("") 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() 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)) 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("").PostTags("") //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" a := client.IndexAnalyze().Index(esIndex) analyzeBody, err := json.Marshal(a) fmt.Println(string(analyzeBody)) 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(3546) 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) }