|
@@ -0,0 +1,275 @@
|
|
|
|
+package elastic
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "context"
|
|
|
|
+ "encoding/json"
|
|
|
|
+ "errors"
|
|
|
|
+ "eta/eta_mini_bridge/utils"
|
|
|
|
+ "fmt"
|
|
|
|
+
|
|
|
|
+ "github.com/olivere/elastic/v7"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+// 首页搜索
|
|
|
|
+func SearchReport(keyWord string, classifyIdFirsts []int, classifyIdSeconds []int, pageIndex, pageSize int) (searchResp *elastic.SearchResult, total int64, err error) {
|
|
|
|
+ indexName := utils.EsReportIndexName
|
|
|
|
+ var must []map[string]interface{}
|
|
|
|
+
|
|
|
|
+ shouldSub := []map[string]interface{}{
|
|
|
|
+ map[string]interface{}{
|
|
|
|
+ "match_phrase": map[string]interface{}{
|
|
|
|
+ "Title": map[string]interface{}{
|
|
|
|
+ "query": keyWord,
|
|
|
|
+ //"slop": "50",
|
|
|
|
+ "boost": 5,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ // map[string]interface{}{
|
|
|
|
+ // "match_phrase": map[string]interface{}{
|
|
|
|
+ // "Categories": map[string]interface{}{
|
|
|
|
+ // "query": keyWord,
|
|
|
|
+ // "boost": 4,
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ // map[string]interface{}{
|
|
|
|
+ // "match_phrase": map[string]interface{}{
|
|
|
|
+ // "BodyContent": map[string]interface{}{
|
|
|
|
+ // "query": keyWord,
|
|
|
|
+ // "boost": 3,
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ }
|
|
|
|
+ mustMap := map[string]interface{}{
|
|
|
|
+ "bool": map[string]interface{}{
|
|
|
|
+ "should": shouldSub,
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+ must = append(must, mustMap)
|
|
|
|
+ filterMust := []map[string]interface{}{
|
|
|
|
+ map[string]interface{}{
|
|
|
|
+ "term": map[string]interface{}{
|
|
|
|
+ "PublishState": 2, //必须是已发布的报告
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ // map[string]interface{}{
|
|
|
|
+ // "terms": map[string]interface{}{
|
|
|
|
+ // "ClassifyIdFirst": classifyIdFirsts, //分类必须是正常显示状态
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ // map[string]interface{}{
|
|
|
|
+ // "terms": map[string]interface{}{
|
|
|
|
+ // "ClassifyIdSecond": classifyIdSeconds, //分类必须是正常显示状态
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ }
|
|
|
|
+ // filterMustNot := []map[string]interface{}{
|
|
|
|
+ // map[string]interface{}{
|
|
|
|
+ // "term": map[string]interface{}{
|
|
|
|
+ // "BodyContent.keyword": map[string]interface{}{
|
|
|
|
+ // "value": "", //过滤没有内容的报告(晨报和周报)bodyContent 不能为空
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ // }
|
|
|
|
+ filterMap := map[string]interface{}{
|
|
|
|
+ "bool": map[string]interface{}{
|
|
|
|
+ "must": filterMust,
|
|
|
|
+ // "must_not": filterMustNot,
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+ source := map[string]interface{}{
|
|
|
|
+ "query": map[string]interface{}{
|
|
|
|
+ "bool": map[string]interface{}{
|
|
|
|
+ "must": must,
|
|
|
|
+ "filter": filterMap,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+ source["from"] = (pageIndex - 1) * pageSize
|
|
|
|
+ source["size"] = pageSize
|
|
|
|
+ source["highlight"] = map[string]interface{}{
|
|
|
|
+ "fields": map[string]interface{}{
|
|
|
|
+ "Title": map[string]interface{}{},
|
|
|
|
+ // "Categories": map[string]interface{}{},
|
|
|
|
+ // "BodyContent": map[string]interface{}{
|
|
|
|
+ // // "pre_tags" : "{{highlight}}",
|
|
|
|
+ // // "post_tags": "{{/highlight}}",
|
|
|
|
+ // },
|
|
|
|
+ },
|
|
|
|
+ "pre_tags": "<span style=\"color:#E3B377\">",
|
|
|
|
+ "post_tags": "</span>",
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ source["sort"] = []map[string]interface{}{
|
|
|
|
+ map[string]interface{}{
|
|
|
|
+ "PublishTime.keyword": map[string]interface{}{
|
|
|
|
+ "order": "desc",
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ map[string]interface{}{
|
|
|
|
+ "_score": map[string]interface{}{
|
|
|
|
+ "order": "desc",
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+ jsonstr, err := json.Marshal(source)
|
|
|
|
+ fmt.Printf("%s", jsonstr)
|
|
|
|
+
|
|
|
|
+ request := utils.EsClient.Search(indexName).Source(source) // sets the JSON request
|
|
|
|
+
|
|
|
|
+ searchResp, err = request.Do(context.Background())
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Print("结果err:")
|
|
|
|
+ fmt.Println(err.Error())
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ fmt.Print("结果正常:")
|
|
|
|
+ fmt.Println(searchResp.Status)
|
|
|
|
+ if searchResp.Status != 0 {
|
|
|
|
+ err = errors.New("查询失败")
|
|
|
|
+ }
|
|
|
|
+ total = searchResp.TotalHits()
|
|
|
|
+ return
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// ReportListSearch 报告列表页的搜索
|
|
|
|
+func ReportListSearch(keyWord string, classifyIdFirst int, classifyIdSeconds []int, pageIndex, pageSize int) (searchResp *elastic.SearchResult, total int64, err error) {
|
|
|
|
+ indexName := utils.EsReportIndexName
|
|
|
|
+ var must []map[string]interface{}
|
|
|
|
+ shouldSub := []map[string]interface{}{
|
|
|
|
+ map[string]interface{}{
|
|
|
|
+ "match": map[string]interface{}{
|
|
|
|
+ "Title": map[string]interface{}{
|
|
|
|
+ "query": keyWord,
|
|
|
|
+ "boost": 3,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ map[string]interface{}{
|
|
|
|
+ "match": map[string]interface{}{
|
|
|
|
+ "StageStr": map[string]interface{}{
|
|
|
|
+ "query": keyWord,
|
|
|
|
+ "boost": 2,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ map[string]interface{}{
|
|
|
|
+ "match": map[string]interface{}{
|
|
|
|
+ "Abstract": map[string]interface{}{
|
|
|
|
+ "query": keyWord,
|
|
|
|
+ "boost": 2,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ // map[string]interface{}{
|
|
|
|
+ // "match": map[string]interface{}{
|
|
|
|
+ // "ClassifyNameSecond": map[string]interface{}{
|
|
|
|
+ // "query": keyWord,
|
|
|
|
+ // "boost": 2,
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ map[string]interface{}{
|
|
|
|
+ "match_phrase": map[string]interface{}{
|
|
|
|
+ "Title": map[string]interface{}{
|
|
|
|
+ "query": keyWord,
|
|
|
|
+ //"slop": "50",
|
|
|
|
+ "boost": 5,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ map[string]interface{}{
|
|
|
|
+ "match_phrase": map[string]interface{}{
|
|
|
|
+ "Abstract": map[string]interface{}{
|
|
|
|
+ "query": keyWord,
|
|
|
|
+ //"slop": "50",
|
|
|
|
+ "boost": 5,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+ mustMap := map[string]interface{}{
|
|
|
|
+ "bool": map[string]interface{}{
|
|
|
|
+ "should": shouldSub,
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+ must = append(must, mustMap)
|
|
|
|
+
|
|
|
|
+ filter := []map[string]interface{}{
|
|
|
|
+ map[string]interface{}{
|
|
|
|
+ "term": map[string]interface{}{
|
|
|
|
+ "PublishState": 2,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ map[string]interface{}{
|
|
|
|
+ "term": map[string]interface{}{
|
|
|
|
+ "ReportChapterId": 0, //排除章节内容
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ // map[string]interface{}{
|
|
|
|
+ // "term": map[string]interface{}{
|
|
|
|
+ // "ClassifyIdFirst": classifyIdFirst,
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ // map[string]interface{}{
|
|
|
|
+ // "terms": map[string]interface{}{
|
|
|
|
+ // "ClassifyIdSecond": classifyIdSeconds,
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ }
|
|
|
|
+ source := map[string]interface{}{
|
|
|
|
+ "query": map[string]interface{}{
|
|
|
|
+ "bool": map[string]interface{}{
|
|
|
|
+ "must": must,
|
|
|
|
+ "filter": filter,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // source["from"] = (pageIndex - 1) * pageSize
|
|
|
|
+ // source["size"] = pageSize
|
|
|
|
+ // source["highlight"] = map[string]interface{}{
|
|
|
|
+ // "fields": map[string]interface{}{
|
|
|
|
+ // "Title": map[string]interface{}{},
|
|
|
|
+ // "Abstract": map[string]interface{}{},
|
|
|
|
+ // "StageStr": map[string]interface{}{},
|
|
|
|
+ // "ClassifyNameSecond": map[string]interface{}{},
|
|
|
|
+ // },
|
|
|
|
+ // "pre_tags": "<span style=\"color:#E3B377\">",
|
|
|
|
+ // "post_tags": "</span>",
|
|
|
|
+ // }
|
|
|
|
+
|
|
|
|
+ // source["sort"] = []map[string]interface{}{
|
|
|
|
+ // map[string]interface{}{
|
|
|
|
+ // "PublishTime.keyword": map[string]interface{}{
|
|
|
|
+ // "order": "desc",
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ // map[string]interface{}{
|
|
|
|
+ // "_score": map[string]interface{}{
|
|
|
|
+ // "order": "desc",
|
|
|
|
+ // },
|
|
|
|
+ // },
|
|
|
|
+ // }
|
|
|
|
+ jsonstr, err := json.Marshal(source)
|
|
|
|
+ fmt.Printf("%s", jsonstr)
|
|
|
|
+ request := utils.EsClient.Search(indexName).Source(source) // sets the JSON request
|
|
|
|
+ searchResp, err = request.Do(context.Background())
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Print("结果err:")
|
|
|
|
+ fmt.Println(err.Error())
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ fmt.Print("结果正常:")
|
|
|
|
+ fmt.Println(searchResp.Status)
|
|
|
|
+ if searchResp.Status != 0 {
|
|
|
|
+ err = errors.New("查询失败")
|
|
|
|
+ }
|
|
|
|
+ total = searchResp.TotalHits()
|
|
|
|
+ return
|
|
|
|
+}
|