package controllers import ( "basic.com/dbapi.git" "basic.com/valib/logger.git" "fmt" "github.com/gin-gonic/gin" "strconv" "strings" "webserver/cache" "webserver/extend/code" "webserver/extend/config" "webserver/extend/esutil" "webserver/extend/util" "webserver/models" ) type EsSearchController struct{} // @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) PostEsSearch(c *gin.Context) { //searchBody := make(map[string]interface{}, 0) //c.BindJSON(&searchBody) //data := findEsData(searchBody) var arg models.EsSearch err := c.BindJSON(&arg) if err != nil || arg.Page <= 0 && arg.Size <= 0 { util.ResponseFormat(c, code.RequestParamError, "参数有误") return } data := findEsData(&arg) util.ResponseFormat(c, code.Success, data) } //获取监控等级 func getAlarmLevel(alarmlevel []int32) []string { d := dbapi.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 findEsData(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 + "\"]}}," } //判断摄像机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 != "" { isCollectStr = "{\"term\":{\"isCollect\":" + isCollect + "}}," linkTagInfoIsCollectStr = "{\"term\":{\"linkTagInfo.isCollect\":" + isCollect + "}}," } //判断布防等级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底层机制处理分页 //请求头 localConf, err2 := cache.GetServerInfo() if err2 != nil || localConf.AlarmIp == "" || localConf.ServerId == "" { logger.Debug("localConfig is wrong!!!") return nil } url := "http://" + localConf.AlarmIp + ":" + strconv.Itoa(int(localConf.AlarmPort)) + "/" + index + "/_search?search_type=dfs_query_then_fetch" analyServerFilterStr := "{\"term\":{\"analyServerId\":\"" + localConf.ServerId + "\"}}," linkTagInfoAnalyServerFilterStr := "{\"term\":{\"linkTagInfo.analyServerId\":\"" + localConf.ServerId + "\"}}," //请求体 prama := "{\"from\":\"" + from + "\"," + "\"size\":\"" + size + "\"," + "\"query\":{\"bool\":{" + queryStr + "\"should\":[" + "{\"bool\":{\"filter\":[" + 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\"]}" + "}" logger.Debug("findEsData.param:", prama) //数据解析 tokenRes := esutil.GetEsDataReq(url, prama, true) tmpAllDate := esutil.ResponseData(tokenRes) //fmt.Println(tokenRes) //tmpAllDate := make(map[string]interface{}) //tmpDate := make(map[string][]interface{}) //tmpAllDate["total"] = tokenRes["total"] //data := tokenRes["datalist"] //for _, masterInfoValues := range data.([]interface{}) { // masterInfo := masterInfoValues.(map[string]interface{}) // sources := make(map[string]interface{}, 0) // activateInfo := make(map[string]interface{}) // if masterInfo["linkTagInfo"] != nil { // linkTagInfo := masterInfo["linkTagInfo"].([]interface{}) // delete(masterInfo, "linkTagInfo") // if len(linkTagInfo) > 0 { // slaveList := make([]interface{}, 0) // slaveList = append(slaveList, masterInfo) // slaveList = append(slaveList, linkTagInfo...) // for i, j := 0, len(slaveList)-1; i < j; i, j = i+1, j-1 { // slaveList[i], slaveList[j] = slaveList[j], slaveList[i] // } // sources["list"] = slaveList // activateInfo = slaveList[0].(map[string]interface{}) // } else { // sources["list"] = []interface{}{ // masterInfo, // } // activateInfo = masterInfo // } // } else { // if _, ok := masterInfo["linkTagInfo"]; ok { // delete(masterInfo, "linkTagInfo") // } // sources["list"] = []interface{}{ // masterInfo, // } // activateInfo = masterInfo // // } // // sources["activeObject"] = activateInfo // // tmpDate["datalist"] = append(tmpDate["datalist"], sources) //} //tmpAllDate["datalist"] = tmpDate["datalist"] return tmpAllDate } //sdkTYype字典"\"_source\":[\"BaseName\",\"Gender\",\"Race\",\"content\",\"idcard\",\"picAddress\",\"picDate\",\"sdkType\",\"Age\",\"personId\",\"personIsHub\",\"personPicUrl\",\"picLocalUrl\",\"picSmUrl\",\"videoIp\",\"videoNum\",\"cameraId\",\"ageDescription\",\"likePer\"]" + //func sdkTypeToValue(i int) string { // value := []string{"人脸", "车辆", "人体", "入侵", "拥挤", "靠右行", "人员异常", "个体静止"} // return value[i-1] //} //获取Dbtablepersons信息 /*func getDBPersonInfo(personId string) map[string]string { url := "http://" + config.EsInfo.Masterip + ":" + config.EsInfo.Httpport + "/" + config.EsInfo.EsIndex.Dbtablepersons.IndexName + "/_search" prama := "{\"query\":{\"term\":{\"uuid\":\"" + personId + "\"}},\"_source\":[\"personName\",\"phoneNum\"]}" tokenRes := esutil.GetEsDataReq(url, prama, true) personRes := make(map[string]string) //logger.Debug(tokenRes["datalist"].([]interface{})) result := tokenRes["datalist"].([]interface{}) for _, value := range result { userMap := value.(map[string]interface{}) if personName, ok := userMap["personName"]; ok { personRes["personName"] = personName.(string) } else { personRes["personName"] = "" } if phoneNum, ok := userMap["phoneNum"]; ok { personRes["phoneNum"] = phoneNum.(string) } else { personRes["phoneNum"] = "" } if sex, ok := userMap["sex"]; ok { personRes["sex"] = sex.(string) } else { personRes["sex"] = "" } // personRes["phoneNum"] = value.(map[string]interface{})["phoneNum"].(string) // personRes["sex"] = value.(map[string]interface{})["sex"].(string) } //logger.Debug(personRes) if len(personRes) < 1 { personRes["personName"] = "" personRes["phoneNum"] = "" personRes["sex"] = "" } return personRes }*/