elasticsearch.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. package services
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "hongze/hongze_cygx/models"
  7. "hongze/hongze_cygx/utils"
  8. "html"
  9. "strconv"
  10. "strings"
  11. "github.com/PuerkitoBio/goquery"
  12. "github.com/olivere/elastic/v7"
  13. "github.com/olivere/elastic/v7/config"
  14. )
  15. const (
  16. ES_URL = "http://es-cn-nif227b580019rgw6.public.elasticsearch.aliyuncs.com:9200" //<1>
  17. ES_USERNAME = "elastic" //<2>
  18. ES_PASSWORD = "hongze@2021" //<3>
  19. //Grafana pwd-> 20521bb9
  20. //Grafana username-> emon
  21. )
  22. func SaveData() {
  23. //fmt.Println("start")
  24. var sniff = false //<4>
  25. cfg := &config.Config{
  26. URL: ES_URL,
  27. Username: ES_USERNAME,
  28. Password: ES_PASSWORD,
  29. }
  30. cfg.Sniff = &sniff
  31. var client, err = elastic.NewClientFromConfig(cfg)
  32. if err != nil {
  33. fmt.Println("NewClientFromConfig Err:" + err.Error())
  34. return
  35. }
  36. var esIndex = "cygx_article"
  37. //var esType = "article"
  38. //
  39. exists, err := client.IndexExists(esIndex).Do(context.Background()) //<5>
  40. if err != nil {
  41. fmt.Println("IndexExists Err:" + err.Error())
  42. return
  43. }
  44. if !exists {
  45. _, err = client.CreateIndex(esIndex).Do(context.Background())
  46. if err != nil {
  47. fmt.Println("CreateIndex Err:" + err.Error())
  48. return
  49. }
  50. }
  51. /*
  52. 3161,3190,3226,3244,3264,3285,3310,3334,3370,3397,3418,3446,3477,3497,3526,3554
  53. */
  54. idStr := `3584,3644`
  55. idArr := strings.Split(idStr, ",")
  56. for _, v := range idArr {
  57. id, _ := strconv.Atoi(v)
  58. item, err := models.GetArticleDetailById(id)
  59. if err != nil {
  60. fmt.Println("GetArticleDetailById Err:" + err.Error())
  61. return
  62. }
  63. content := html.UnescapeString(item.Body)
  64. doc, err := goquery.NewDocumentFromReader(strings.NewReader(content))
  65. if err != nil {
  66. fmt.Println("create doc err:", err.Error())
  67. return
  68. }
  69. bodyText := doc.Text()
  70. item.BodyText = bodyText
  71. //新增
  72. resp, err := client.Index().Index(esIndex).Id(strconv.Itoa(item.ArticleId)).BodyJson(item).Do(context.Background())
  73. if err != nil {
  74. fmt.Println("insert es failed", err.Error())
  75. return
  76. }
  77. fmt.Println(resp.Status)
  78. }
  79. /*
  80. //根据id查询
  81. searchById, err := client.Get().Index(esIndex).Type(esType).Id("3138").Do(context.Background())
  82. if searchById.Found {
  83. body, err := searchById.Source.MarshalJSON()
  84. fmt.Println("body:",string(body))
  85. fmt.Println(err)
  86. //var resultType models.ArticleDetail
  87. //if err := json.Unmarshal(searchById.Source,&resultType); err != nil{
  88. // log.Error(err.Error())
  89. //}
  90. //fmt.Printf("search by id: %#v \n",resultType)
  91. }
  92. */
  93. ////查询index中所有的数据
  94. //var resultType models.CygxArticle
  95. //searchAll,err := client.Search(esIndex).Type(esType).Do(context.Background())
  96. //for _,item := range searchAll.Each(reflect.TypeOf(resultType)) {
  97. // language := item.(models.CygxArticle)
  98. // fmt.Printf("search by index all: %#v \n",language)
  99. //}
  100. //根据检索条件查询
  101. // boolquery := elastic.NewBoolQuery()
  102. // boolquery.Should(elastic.NewMatchQuery("Body", "专家"))
  103. // highlight := elastic.NewHighlight()
  104. // highlight = highlight.Fields(elastic.NewHighlighterField("Body"))
  105. // highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
  106. // var pageSize int
  107. // pageSize = 20
  108. // searchByMatch, err := client.Search(esIndex).Highlight(highlight).Size(pageSize).Query(boolquery).Do(context.Background())
  109. // var result string
  110. // if searchByMatch.Hits != nil {
  111. // }
  112. // //fmt.Println(string(result))
  113. // utils.FileLog.Info("%s", string(result))
  114. //var resultType models.CygxArticle
  115. //for k,item := range searchByMatch.Each(reflect.TypeOf(resultType)) {
  116. // language := item.(models.CygxArticle)
  117. // fmt.Printf("search by match: %#v \n",language)
  118. //
  119. // fmt.Println(k)
  120. // result,err:=json.Marshal(language)
  121. // fmt.Println(err)
  122. // utils.FileLog.Info("%s",string(result))
  123. //}
  124. // Perform the search request.
  125. //searchByMatch, err := client.Search(esIndex).Type(esType).Query(query).From(1).Size(10).Do(context.Background())
  126. fmt.Println("end")
  127. }
  128. func SearchByKeyWord(keyWord, categoryName string) (result []*models.SearchItem, err error) {
  129. pageSize := 20
  130. keyWordArr, err := GetIndustryMapNameSlice(keyWord)
  131. if err != nil {
  132. go utils.SendEmail(utils.APPNAME+" "+utils.RunMode+"异常提醒:", "GetIndustryMapNameSlice:"+err.Error(), utils.EmailSendToUsers)
  133. }
  134. var sniff = false //<4>
  135. cfg := &config.Config{
  136. URL: ES_URL,
  137. Username: ES_USERNAME,
  138. Password: ES_PASSWORD,
  139. }
  140. cfg.Sniff = &sniff
  141. client, err := elastic.NewClientFromConfig(cfg)
  142. if err != nil {
  143. return
  144. }
  145. var esIndex = "cygx_article"
  146. termsQuery := elastic.NewTermsQuery("category_name", categoryName)
  147. searchMap := make(map[int]int)
  148. for _, v := range keyWordArr {
  149. keyWord = v
  150. boolquery := elastic.NewBoolQuery()
  151. boolquery.Must(elastic.NewMatchQuery("Title", keyWord), elastic.NewMatchQuery("BodyText", keyWord))
  152. highlight := elastic.NewHighlight()
  153. highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText"))
  154. highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
  155. searchByMatch, err := client.Search(esIndex).Highlight(highlight).Size(pageSize).Query(termsQuery).Query(boolquery).Do(context.Background())
  156. if err != nil {
  157. return result, err
  158. }
  159. if searchByMatch.Hits != nil {
  160. for _, v := range searchByMatch.Hits.Hits {
  161. articleJson, err := v.Source.MarshalJSON()
  162. if err != nil {
  163. return nil, err
  164. }
  165. article := new(models.CygxArticle)
  166. err = json.Unmarshal(articleJson, &article)
  167. if err != nil {
  168. return nil, err
  169. }
  170. if _, ok := searchMap[article.ArticleId]; !ok {
  171. searchItem := new(models.SearchItem)
  172. searchItem.ArticleId, _ = strconv.Atoi(v.Id)
  173. searchItem.Body = v.Highlight["BodyText"]
  174. var title string
  175. if len(v.Highlight["Title"]) > 0 {
  176. title = v.Highlight["Title"][0]
  177. } else {
  178. title = article.Title
  179. }
  180. searchItem.Title = title
  181. searchItem.PublishDate = article.PublishDate
  182. result = append(result, searchItem)
  183. searchMap[article.ArticleId] = article.ArticleId
  184. }
  185. }
  186. }
  187. }
  188. return
  189. }
  190. func esSearch(keyWord, categoryName string) (result []*models.SearchItem, err error) {
  191. pageSize := 20
  192. var sniff = false //<4>
  193. cfg := &config.Config{
  194. URL: ES_URL,
  195. Username: ES_USERNAME,
  196. Password: ES_PASSWORD,
  197. }
  198. cfg.Sniff = &sniff
  199. client, err := elastic.NewClientFromConfig(cfg)
  200. if err != nil {
  201. return
  202. }
  203. var esIndex = "cygx_article"
  204. termsQuery := elastic.NewTermsQuery("category_name", categoryName)
  205. boolquery := elastic.NewBoolQuery()
  206. boolquery.Must(elastic.NewMatchQuery("Title", keyWord), elastic.NewMatchQuery("BodyText", keyWord))
  207. highlight := elastic.NewHighlight()
  208. highlight = highlight.Fields(elastic.NewHighlighterField("Title"), elastic.NewHighlighterField("BodyText"))
  209. highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
  210. searchByMatch, err := client.Search(esIndex).Highlight(highlight).Size(pageSize).Query(termsQuery).Query(boolquery).Do(context.Background())
  211. if err != nil {
  212. return result, err
  213. }
  214. searchMap := make(map[int]int)
  215. if searchByMatch.Hits != nil {
  216. for _, v := range searchByMatch.Hits.Hits {
  217. articleJson, err := v.Source.MarshalJSON()
  218. if err != nil {
  219. return nil, err
  220. }
  221. article := new(models.CygxArticle)
  222. err = json.Unmarshal(articleJson, &article)
  223. if err != nil {
  224. return nil, err
  225. }
  226. if _, ok := searchMap[article.ArticleId]; !ok {
  227. searchItem := new(models.SearchItem)
  228. searchItem.ArticleId, _ = strconv.Atoi(v.Id)
  229. searchItem.Body = v.Highlight["BodyText"]
  230. var title string
  231. if len(v.Highlight["Title"]) > 0 {
  232. title = v.Highlight["Title"][0]
  233. } else {
  234. title = article.Title
  235. }
  236. searchItem.Title = title
  237. searchItem.PublishDate = article.PublishDate
  238. result = append(result, searchItem)
  239. searchMap[article.ArticleId] = article.ArticleId
  240. }
  241. }
  242. }
  243. return
  244. }