package controllers import ( "basic.com/valib/bhomeclient.git" "basic.com/valib/bhomedbapi.git" "basic.com/valib/logger.git" "fmt" "strconv" "strings" "vamicro/config" "vamicro/search-service/esutil" "vamicro/search-service/models" ) // @Security ApiKeyAuth // @Summary 检索 // @Description 信息检索和比对检索 // @Accept json // @Produce json // @Tags es // @Param obj body models.EsSearch true "底库数据" // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/es/esSearch [POST] func (sc *EsSearchController) PostEsSearchAggs(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var arg models.EsSearch err := c.BindJSON(&arg) if err != nil || arg.Page <= 0 && arg.Size <= 0 { return &bhomeclient.Reply{Success: false, Msg: "参数有误"} } data := findEsDataAggs(&arg) return &bhomeclient.Reply{Success: true, Data: data} } //// 获取监控等级 //func getAlarmLevel(alarmlevel []int32) []string { // d := bhomedbapi.DicApi{} // res, data := d.FindByType("ALARMLEVEL") // if data == nil { // logger.Debug("data is nil") // } // logger.Debug(res) // // logger.Debug(data) // alarmLevel := make(map[int32]string) // tmp := data.(map[string]interface{}) // for _, value := range tmp["ALARMLEVEL"].([]interface{}) { // // logger.Debug(value.(map[string]interface{})["value"]," ",value.(map[string]interface{})["name"]) // val := value.(map[string]interface{})["value"].(string) // name := value.(map[string]interface{})["name"].(string) // vl, err := strconv.Atoi(val) // if err != nil { // logger.Debug(err) // } // alarmLevel[int32(vl)] = name // } // alarmLevelRes := make([]string, len(alarmlevel)) // for i, v := range alarmlevel { // if v < 0 { // alarmLevelRes[i] = "撤防" // } else { // alarmLevelRes[i] = alarmLevel[v] // } // } // return alarmLevelRes //} func findEsDataAggs(searchBody *models.EsSearch) map[string]interface{} { //webPage := searchBody.Page //webSize := searchBody.Size //from := strconv.Itoa((webPage - 1) * webSize) //esFrom := strconv.Itoa(from) //esSize := strconv.Itoa(webSize) //size := strconv.Itoa(webSize) //请求索引 index := config.EsInfo.EsIndex.AiOcean.IndexName queryStr := "" queryBody := searchBody.InputValue //检索框 if queryBody != "" { queryStr = "\"must\":[{\"multi_match\":{\"query\":\"" + queryBody + "\",\"fields\":[\"cameraAddr^1.5\",\"taskName^1.5\",\"sdkName^1.5\",\"showLabels^3.0\",\"baseInfo.tableName^1.5\",\"baseInfo.targetName^1.5\",\"baseInfo.labels^1.5\",\"alarmRules.alarmLevel^1.5\",\"linkTag^1.5\",\"linkTagInfo.cameraAddr\",\"linkTagInfo.taskName^1.5\",\"linkTagInfo.sdkName^1.5\",\"linkTagInfo.showLabels^1.5\",\"linkTagInfo.baseInfo.tableName^1.5\",\"linkTagInfo.baseInfo.targetName^1.5\",\"linkTagInfo.baseInfo.labels^1.5\",\"linkTagInfo.alarmRules.alarmLevel^1.5\"]," + "\"type\":\"cross_fields\",\"operator\":\"OR\",\"slop\":0,\"prefix_length\":0,\"max_expansions\":50,\"zero_terms_query\":\"NONE\",\"auto_generate_synonyms_phrase_query\":true,\"fuzzy_transpositions\":true,\"boost\":1}}]," } searchTime := searchBody.SearchTime if searchTime == nil || len(searchTime) < 2 { info := make(map[string]interface{}, 0) info["err"] = "请输入时间范围" return info } gteDate := searchTime[0] lteDate := searchTime[1] //判断数据ID idStr := "" linkTagInfoIdStr := "" //personId := searchBody.Id id := []string{} if id != nil && len(id) > 0 { esId := strings.Replace(strings.Trim(fmt.Sprint(id), "[]"), " ", "\",\"", -1) idStr = "{\"terms\":{\"id\":[\"" + esId + "\"]}}," linkTagInfoIdStr = "{\"terms\":{\"linkTagInfo.id\":[\"" + esId + "\"]}}," } //判断任务ID taskIdStr := "" linkTagInfoTaskIdStr := "" taskId := searchBody.Tasks if taskId != nil && len(taskId) > 0 { esTaskId := strings.Replace(strings.Trim(fmt.Sprint(taskId), "[]"), " ", "\",\"", -1) taskIdStr = "{\"terms\":{\"taskId\":[\"" + esTaskId + "\"]}}," linkTagInfoTaskIdStr = "{\"terms\":{\"linkTagInfo.taskId\":[\"" + esTaskId + "\"]}}," } //判断数据来源 dataSourceStr := "" dataSource := searchBody.DataSource if dataSource != "" { dataSourceStr = "{\"term\":{\"dataSource\":\"" + dataSource + "\"}}," } //判断摄像机ID cameraIdStr := "" linkTagInfoCameraIdStr := "" cameraId := searchBody.TreeNodes if cameraId != nil && len(cameraId) > 0 { esCameraId := strings.Replace(strings.Trim(fmt.Sprint(cameraId), "[]"), " ", "\",\"", -1) cameraIdStr = "{\"terms\":{\"cameraId\":[\"" + esCameraId + "\"]}}," linkTagInfoCameraIdStr = "{\"terms\":{\"linkTagInfo.cameraId\":[\"" + esCameraId + "\"]}}," } //判断库表ID tableId := searchBody.Tabs esTableId := "" esTableIdStr := "" linkTagInfoEsTableIdStr := "" if tableId != nil && len(tableId) > 0 { esTableId = strings.Replace(strings.Trim(fmt.Sprint(tableId), "[]"), " ", "\",\"", -1) esTableIdStr = "{\"terms\":{\"baseInfo.tableId\":[\"" + esTableId + "\"]}}," linkTagInfoEsTableIdStr = "{\"terms\":{\"linkTagInfo.baseInfo.tableId\":[\"" + esTableId + "\"]}}," } //判断收藏状态 isCollectStr := "" linkTagInfoIsCollectStr := "" isCollect := searchBody.Collection if isCollect != "" { if isCollect == "1" { isCollectStr = "{\"term\":{\"isCollect\":true}}," linkTagInfoIsCollectStr = "{\"term\":{\"linkTagInfo.isCollect\":true}}," } else if isCollect == "0" { isCollectStr = "{\"term\":{\"isCollect\":false}}," linkTagInfoIsCollectStr = "{\"term\":{\"linkTagInfo.isCollect\":false}}," } } //判断布防等级id alarmLevelId := searchBody.AlarmLevel alarmLevelStr := "" linkTagInfoAlarmLevelStr := "" if len(alarmLevelId) > 0 { alarmLevelTypes := strings.Replace(strings.Trim(fmt.Sprint(getAlarmLevel(alarmLevelId)), "[]"), " ", "\",\"", -1) alarmLevelStr = "{\"terms\":{\"alarmRules.alarmLevel.raw\":[\"" + alarmLevelTypes + "\"]}}," linkTagInfoAlarmLevelStr = "{\"terms\":{\"linkTagInfo.alarmRules.alarmLevel.raw\":[\"" + alarmLevelTypes + "\"]}}," } //使用es底层机制处理分页 //请求头 serverId := config.Server.AnalyServerId var sApi bhomedbapi.SysSetApi flag, localConf := sApi.GetServerInfo() if !flag || localConf.AlarmIp == "" || localConf.AlarmPort == 0 { logger.Debug("localConf err") return nil } url := "http://" + localConf.AlarmIp + ":" + strconv.Itoa(int(localConf.AlarmPort)) + "/" + index + "/_search?search_type=dfs_query_then_fetch" analyServerFilterStr := "" if !searchBody.IsAll { analyServerFilterStr = "{\"term\":{\"analyServerId\":\"" + serverId + "\"}}," } linkTagInfoAnalyServerFilterStr := "{\"term\":{\"linkTagInfo.analyServerId\":\"" + serverId + "\"}}," //请求体 prama := "{\"size\": 0," + "\"query\":{\"bool\":{" + queryStr + "\"should\":[" + "{\"bool\":{\"filter\":[" + dataSourceStr + cameraIdStr + alarmLevelStr + idStr + taskIdStr + isCollectStr + esTableIdStr + analyServerFilterStr + "{\"range\":{\"picDate\":{\"from\":\"" + gteDate + "\",\"to\":\"" + lteDate + "\",\"include_lower\":true,\"include_upper\":true,\"boost\":1}}}" + "]}}," + "{\"bool\":{\"filter\":[" + linkTagInfoCameraIdStr + linkTagInfoAlarmLevelStr + linkTagInfoIdStr + linkTagInfoTaskIdStr + linkTagInfoIsCollectStr + linkTagInfoEsTableIdStr + linkTagInfoAnalyServerFilterStr + "{\"range\":{\"linkTagInfo.picDate\":{\"from\":\"" + gteDate + "\",\"to\":\"" + lteDate + "\",\"include_lower\":true,\"include_upper\":true,\"boost\":1}}}" + "]}}" + "],\"minimum_should_match\":1}}," + "\"sort\":[{\"_score\":{\"order\":\"desc\"}},{\"updateTime\":{\"order\":\"desc\"}}]," + "\"_source\":{\"includes\":[],\"excludes\":[\"*.feature\"]}," + "\"aggs\": {\"group_by_taskId\": {\"terms\": {\"field\": \"taskId\",\"size\": 1000000},\"aggs\": {\"task_info\": {\"top_hits\": {\"size\": 1,\"_source\": [\"taskName\"]}}}}}" + "}" logger.Debug("url: ", url) logger.Debug("findEsData.param:", prama) //数据解析 tokenResBuf, errEsReq := esutil.EsReq("POST", url, []byte(prama)) if errEsReq != nil { return nil } tmpAllData, errSourceAggregationList := esutil.SourceAggregationList(tokenResBuf) if errSourceAggregationList != nil { return nil } dataAggs := make(map[string]interface{}) dataAggs["buckets"] = tmpAllData return dataAggs }