package controllers import ( "encoding/json" "fmt" "github.com/gin-gonic/gin" "math/rand" "strconv" "strings" "webserver/extend/code" "webserver/extend/config" "webserver/extend/esutil" "webserver/extend/util" "webserver/models" "webserver/service" ) type EsController struct{} // @Summary 比对数据查询 // @Description 比对数据查询 // @Accept json // @Produce json // @Tags es // @Param reqMap body models.EsSearch true "collection 为空" // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/es/queryEsCompareData [POST] func PostEsCompareData(c *gin.Context) { searchBody := new(models.EsSearch) c.BindJSON(&searchBody) isEsSource := true databases := searchBody.DataBases page := searchBody.Page if page <= 0 { page = 1 } size := searchBody.Size if size <= 0 { size = 8 } from := (page - 1) * size to := page * size threshold := searchBody.Threshold if threshold < 0 || threshold > 100 { threshold = 60 } picUrl := searchBody.PicUrl /*feature := searchBody.Feature*/ var featByte []byte if len(picUrl) > 3 { // linux /*fileName := picUrl // picIp 定义在 fileController weedfs 文件服务器 访问 路径 前缀 detect := gorun.GetSimpleFaceDetect(fileName) if len(detect) != 1 { util.ResponseFormat(c,code.TooManyFeatureFindError,"图片特征值过多") return }else { featByte = detect[0]["feature"].([]byte) }*/ // linux } data := make(map[string]interface{}) searchBody.Page = 1 searchBody.Size = 15000 //searchMap := Struct2Map(*searchBody) if len(databases) == 1 && databases[0] == "esData" { searchBody.IsAggs = false data = searchEsData(*searchBody) } else { isEsSource = false data = service.QueryDbPersonsForCompare(*searchBody) } sources := data["datalist"].([]interface{}) if len(sources) > 0 { //进行比对 sources = sourceCompare(sources, isEsSource, featByte, threshold) } else { fmt.Println("查询条件下无数据 source 数据为空:" + string(len(sources))) } dataLen := len(sources) if from > dataLen-1 { from = 0 to = 0 } if to > dataLen { to = dataLen } sources = sources[from:to] // 数据 部分获取 if !isEsSource { // 人员数据要加底库名称 for _, sou := range sources { tableId := sou.(map[string]interface{})["tableId"] if tableId != nil { info := QueryDbTableInfo(tableId.(string)) if info["tableName"] != nil { sou.(map[string]interface{})["tableName"] = info["tableName"] } else { sou.(map[string]interface{})["tableName"] = "其他" } if info["bwType"] != nil { sou.(map[string]interface{})["bwType"] = info["bwType"] } else { sou.(map[string]interface{})["bwType"] = "4" } } } } dmap := make(map[string]interface{}, 2) dmap["datalist"] = sources dmap["total"] = dataLen util.ResponseFormat(c, code.Success, dmap) } // @Summary 查询摄像机以及启算法 // @Description 关联查询摄像机以及启算法 // @Produce json // @Tags camera // @Success 200 {string} json "{"code":200, success:true, msg:"请求处理成功", data:"摄像机信息"}" // @Failure 500 {string} json "{"code":500, success:false msg:"",data:"错误信息内容"}" // @Router /data/api-v/camera/queryCameraAndTaskInfo [get] func (ac *CameraController) QueryCameraAndTaskInfo(c *gin.Context) { var cam models.Camera rows := cam.FindAllCamTask() if len(rows) == 0 { util.ResponseFormat(c, code.ComError, "没有记录") return } camList := make([]map[string]interface{}, 0, 5) for _, cam := range rows { newCam := make(map[string]interface{}) newCam["cameraid"] = cam.Id newCam["rtspUrl"] = cam.Rtsp tasks := cam.CamTask taskList := make([]map[string]interface{}, 0) if tasks != nil { taskmap := make(map[string]interface{}) for _, task := range tasks { taskId := taskmap[task.Taskid] if taskId != nil { cameraTasks := taskmap[task.Taskid].([]models.CameraTask) cameraTasks = append(cameraTasks, task) taskmap[task.Taskid] = cameraTasks } else { cameraTasks := make([]models.CameraTask, 0) taskmap[task.Taskid] = append(cameraTasks, task) } } for key, value := range taskmap { i := make(map[string]interface{}) i["taskid"] = key i["sdklist"] = value taskList = append(taskList, i) } } newCam["tasklist"] = taskList camList = append(camList, newCam) } c.JSON(200, camList) } func searchEsData(searchBody models.EsSearch) map[string]interface{} { //请求索引 index := config.EsInfo.EsIndex.VideoPersons.IndexName // wp只查人脸数据 queryStr := "" queryBody := searchBody.InputValue //检索框 if queryBody != "" { queryStr = "\"must\":[{\"multi_match\":{\"query\":\"" + queryBody + "\",\"fields\":[\"tableName^1.5\",\"sex^2.0\",\"race^2.0\",\"content^1.0\",\"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}}]," } gteDate := searchBody.SearchTime[0] lteDate := searchBody.SearchTime[1] //判断任务ID taskIdStr := "" taskId := searchBody.Tasks if taskId != nil && len(taskId) > 0 { esTaskId := strings.Replace(strings.Trim(fmt.Sprint(taskId), "[]"), " ", "\",\"", -1) taskIdStr = "{\"terms\":{\"taskId\":[\"" + esTaskId + "\"]}}," } //判断摄像机ID cameraIdStr := "" cameraId := searchBody.TreeNodes if cameraId != nil && len(cameraId) > 0 { esCameraId := strings.Replace(strings.Trim(fmt.Sprint(cameraId), "[]"), " ", "\",\"", -1) cameraIdStr = "{\"terms\":{\"cameraId\":[\"" + esCameraId + "\"]}}," } //判断库表ID tableId := searchBody.Tabs esTableId := "" esTableIdStr := "" if tableId != nil && len(tableId) > 0 { esTableId = strings.Replace(strings.Trim(fmt.Sprint(tableId), "[]"), " ", "\",\"", -1) esTableIdStr = "{\"terms\":{\"tableId\":[\"" + esTableId + "\"]}}," } isCollectionStr := "" isCollection := searchBody.Collection if isCollection != "" { isCollectionStr = "{\"term\":{\"collection\":\"" + isCollection + "\"}}," } webPage := searchBody.Page webSize := searchBody.Size from := (webPage - 1) * webSize esFrom := strconv.Itoa(from) esSize := strconv.Itoa(webSize) //使用es底层机制处理分页 //请求头 url := "http://" + config.EsInfo.Masterip + ":" + config.EsInfo.Httpport + "/" + index + "/_search?search_type=dfs_query_then_fetch" //请求体 prama := "{\"from\":\"" + esFrom + "\",\"size\":\"" + esSize + "\"," + // prama := "{\"size\":\"0\"," + "\"query\":{\"bool\":{" + queryStr + "\"filter\":[" + cameraIdStr + taskIdStr + isCollectionStr + esTableIdStr + "{\"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\"]}" fmt.Println(prama) //数据解析 tokenRes := esutil.GetEsDataReq(url, prama, true) return tokenRes } func sourceCompare(sources []interface{}, isEsSource bool, campareByte []byte, threshold float32) []interface{} { var filterName = "feature" if isEsSource { filterName = "FaceFeature" } fmt.Println("查询" + filterName) dataSource := make([]interface{}, 0, 20) for _, obj := range sources { source := obj.(map[string]interface{}) //feature := source[filterName].(string) // linux //featByte, _ := base64.StdEncoding.DecodeString(feature) // linux //score := gosdk.FaceCompare(featByte, campareByte) // linux score := rand.Float32() // windows if score >= threshold*0.01 { source["score"] = int(score * 100) dataSource = append(dataSource, source) } } return dataSource } // type 转 map func Struct2Map(obj interface{}) map[string]interface{} { var data = make(map[string]interface{}) bytes, _ := json.Marshal(obj) json.Unmarshal(bytes, &data) /*t := reflect.TypeOf(obj) v := reflect.ValueOf(obj) for i := 0; i < t.NumField(); i++ { data[t.Field(i).Name] = v.Field(i).Interface() }*/ return data }