package stdlib import ( "fmt" "log" "regexp" "strings" jyDocsRpcUtil "app.yhyue.com/moapp/jy_docs/services/util" "app.yhyue.com/moapp/jybase/common" elastic "app.yhyue.com/moapp/jybase/esv7" ) const ( Es_Query_Boosting = `{"query":{"boosting":{"positive":{"bool":{"must":[%s]}},"negative":{"bool":{"must":[%s]}},"negative_boost":2}}%s}` Es_Query_Bool = `{"query":{"bool":{"filter":[%s]}}%s}` Es_Query_Append = `,"_source":["title","publishtime"],"sort":{%s},"from":%d,"size":%d,"highlight":{"fields":{"docName":{},"docSummary":{}}}` Multi_Match = `{"multi_match":{"query":"%s","fields":["docName","docSummary"]}}` Multi_Match_Phrase = `{"multi_match":{"query":"%s","fields":["docName.docName_c","docSummary.docSummary_c"],"type":"phrase"}}` Terms = `{"trems":{"%s":[%s]}}` ) var ( Reg = regexp.MustCompile(`\s+`) ) func FindDocumentById(id int) { log.Println(jyDocsRpcUtil.GetJyDocsDB().Exec("select * from ").Error) } func FindDocumentsByKeyWords(keyWord string, docClass, docTag []string, publishTimeSort, downloadSort, viewSort, pageNum, pageSize int64) (int64, *[]map[string]interface{}) { defer common.Catch() keyWord = strings.TrimSpace(keyWord) musts := []string{} negative_musts := []string{} sorts := []string{`"_score":"desc"`} //上架时间 if publishTimeSort > 0 { sorts = append(sorts, `"create_at":"asc"`) } else if viewSort < 0 { sorts = append(sorts, `"create_at":"desc"`) } //下载量 if downloadSort > 0 { sorts = append(sorts, `"downTimes":"asc"`) } else if viewSort < 0 { sorts = append(sorts, `"downTimes":"desc"`) } //浏览量 if viewSort > 0 { sorts = append(sorts, `"viewTimes":"asc"`) } else if viewSort < 0 { sorts = append(sorts, `"viewTimes":"desc"`) } //分类 if len(docClass) > 0 { musts = append(musts, fmt.Sprintf(Terms, "docClassLevelOne", strings.Join(docClass, ","))) } //标签 if len(docTag) > 0 { musts = append(musts, fmt.Sprintf(Terms, "docTags", strings.Join(docTag, ","))) } //搜索词 if keyWord != "" { for _, v := range strings.Split(keyWord, " ") { v = strings.ReplaceAll(v, `"`, `\"`) musts = append(musts, fmt.Sprintf(Multi_Match, v)) negative_musts = append(negative_musts, fmt.Sprintf(Multi_Match_Phrase, v)) } } if len(musts) == 0 { return 0, nil } query := "" if keyWord != "" { query = Es_Query_Boosting } else { query = Es_Query_Bool } query = fmt.Sprintf(query, strings.Join(musts, ","), fmt.Sprintf(Es_Query_Append, strings.Join(sorts, ","), (pageNum-1)*pageSize, pageSize)) log.Println("query:", query) return elastic.DfsGet(jyDocsRpcUtil.Es_JyDoc, "", query) }