package controllers import ( "basic.com/dbapi.git" "fmt" "strconv" "strings" "webserver/extend/logger" "github.com/gin-gonic/gin" "webserver/extend/code" "webserver/extend/config" "webserver/extend/esutil" "webserver/extend/util" ) type EsSearchController struct{} // @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) util.ResponseFormat(c, code.Success, data) } //获取监控等级 func getAlarmLevel(alarmlevel []interface{}) []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[int]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[vl] = name } alarmLevelRes := make([]string, len(alarmlevel)) for i, v := range alarmlevel { value := int(v.(float64)) if value < 0 { alarmLevelRes[i] = "撤防" } else { alarmLevelRes[i] = alarmLevel[value] } } return alarmLevelRes } func findEsData(searchBody map[string]interface{}) map[string]interface{} { webPage := int(searchBody["page"].(float64)) webSize := int(searchBody["size"].(float64)) from := strconv.Itoa((webPage - 1) * webSize) //esFrom := strconv.Itoa(from) //esSize := strconv.Itoa(webSize) size := strconv.Itoa(webSize) //请求索引 index := config.EsInfo.EsIndex.VideoPersons.IndexName + "," + config.EsInfo.EsIndex.Personaction.IndexName queryStr := "" queryBody := searchBody["inputValue"].(string) //检索框 if queryBody != "" { queryStr = "\"must\":[{\"multi_match\":{\"query\":\"" + queryBody + "\",\"fields\":[\"baseInfo.sex\",\"baseInfo.phoneNum.raw^1.5\",\"baseInfo.personName.raw^1.5\",\"alarmRules.alarmLevel^1.5\",\"alarmRules.linkInfo^1.5\",\"ageDescription^1.5\",\"taskName^1.5\",\"baseInfo.tableName^1.5\",\"sex^2.0\",\"race^2.0\",\"content^1.0\",\"baseInfo.idCard^1.8\",\"cameraAddr^1.0\"]," + "\"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"].([]interface{}) if searchBody["searchTime"] == nil || len(searchTime) < 2 { info := make(map[string]interface{}, 0) info["err"] = "请输入时间范围" return info } gteDate := searchTime[0].(string) lteDate := searchTime[1].(string) //判断任务ID taskIdStr := "" taskId := searchBody["tasks"].([]interface{}) if taskId != nil && len(taskId) > 0 { esTaskId := strings.Replace(strings.Trim(fmt.Sprint(taskId), "[]"), " ", "\",\"", -1) taskIdStr = "{\"terms\":{\"taskId\":[\"" + esTaskId + "\"]}}," } //判断摄像机ID cameraIdStr := "" cameraId := searchBody["treeNodes"].([]interface{}) if cameraId != nil && len(cameraId) > 0 { esCameraId := strings.Replace(strings.Trim(fmt.Sprint(cameraId), "[]"), " ", "\",\"", -1) cameraIdStr = "{\"terms\":{\"cameraId\":[\"" + esCameraId + "\"]}}," } //判断库表ID tableId := searchBody["tabs"].([]interface{}) esTableId := "" esTableIdStr := "" if tableId != nil && len(tableId) > 0 { esTableId = strings.Replace(strings.Trim(fmt.Sprint(tableId), "[]"), " ", "\",\"", -1) index = config.EsInfo.EsIndex.VideoPersons.IndexName esTableIdStr = "{\"terms\":{\"baseInfo.tableId\":[\"" + esTableId + "\"]}}," } //判断收藏状态 isCollectStr := "" isCollect := searchBody["collection"].(string) if isCollect != "" { isCollectStr = "{\"term\":{\"isCollect\":\"" + isCollect + "\"}}," } //判断布防等级id alarmLevelId := searchBody["alarmlevel"].([]interface{}) alarmLevelStr := "" if len(alarmLevelId) > 0 { alarmLevelTypes := strings.Replace(strings.Trim(fmt.Sprint(getAlarmLevel(alarmLevelId)), "[]"), " ", "\",\"", -1) alarmLevelStr = "{\"terms\":{\"alarmRules.alarmLevel\":[\"" + alarmLevelTypes + "\"]}}," } //使用es底层机制处理分页 //请求头 url := "http://" + config.EsInfo.Masterip + ":" + config.EsInfo.Httpport + "/" + index + "/_search?search_type=dfs_query_then_fetch" var setApi dbapi.SysSetApi _, sysconf := setApi.GetServerInfo() analyServerFilterStr := "{\"term\":{\"analyServerId\":\"" + sysconf.ServerId + "\"}}," //请求体 prama := "{\"from\":\"" + from + "\"," + "\"size\":\"" + size + "\"," + "\"query\":{\"bool\":{" + queryStr + "\"filter\":[" + cameraIdStr + alarmLevelStr + taskIdStr + isCollectStr + esTableIdStr + analyServerFilterStr + "{\"range\":{\"picDate\":{\"from\":\"" + gteDate + "\",\"to\":\"" + lteDate + "\",\"include_lower\":true,\"include_upper\":true,\"boost\":1}}}]}}," + "\"sort\":[{\"_score\":{\"order\":\"desc\"}},{\"picDate\":{\"order\":\"desc\"}}]," + "\"_source\":[\"baseInfo\",\"alarmRules\",\"sex\",\"analyServerName\",\"sdkName\",\"ageDescription\",\"content\",\"id\",\"cameraAddr\",\"picMaxUrl\",\"picDate\",\"race\",\"videoUrl\",\"picSmUrl\",\"taskName\",\"personIsHub\",\"isAlarm\",\"analyServerIp\",\"cameraId\",\"linkId\"]" + "}" //logger.Debug("findEsData.param:",prama) //数据解析 tokenRes := esutil.GetEsDataReq(url, prama, true) //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) sources["activeObject"] = masterInfo source := make([]map[string]interface{}, 0) source = append(source, masterInfo) linkId := "" if masterInfo["linkId"] != nil { linkId = masterInfo["linkId"].(string) } id := masterInfo["id"].(string) if linkId != "" { linkInfo := GetLinkInfo(linkId, id) for _, slaveInfoValues := range linkInfo { slaveInfo := slaveInfoValues source = append(source, slaveInfo) } } sources["list"] = source tmpDate["datalist"] = append(tmpDate["datalist"], sources) } tmpAllDate["datalist"] = tmpDate["datalist"] return tmpAllDate } func GetLinkInfo(linkId string, id string) []map[string]interface{} { url := "http://" + config.EsInfo.Masterip + ":" + config.EsInfo.Httpport + "/" + config.EsInfo.EsIndex.VideoPersons.IndexName + "," + config.EsInfo.EsIndex.Personaction.IndexName + "/_search?search_type=dfs_query_then_fetch" jsonDSL := "{\"query\":{\"bool\":{\"filter\":[{\"term\":{\"linkId.keyword\":\"" + linkId + "\"}}],\"must_not\":[{\"term\":{\"id\":\"" + id + "\"}}]}},\"size\":100}" buf, err := esutil.EsReq("POST", url, []byte(jsonDSL)) if err != nil { logger.Debug(err) } sources, err := esutil.Sourcelist(buf) if err != nil { logger.Debug(err) } return sources } //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 }*/