package controllers import ( "basic.com/dbapi.git" "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) err := c.BindJSON(&searchBody) if err != nil || searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 { util.ResponseFormat(c, code.RequestParamError, "参数有误") return } if searchBody.CompareNum !="" { //二次搜索,不需要再比对了 co := service.GetCompResultByNum(searchBody.CompareNum) if co != nil { //二次搜索和排序 twiceM := GetCompareDataTwice(co,searchBody) util.ResponseFormat(c,code.Success,twiceM) return } else { m :=make(map[string]interface{},0) m["compareNum"] = searchBody.CompareNum m["total"] = 0 m["totalList"] = []CompareResult{} util.ResponseFormat(c,code.CompareResultGone,m) return } } m :=make(map[string]interface{},0) m["compareNum"] = searchBody.CompareNum m["total"] = 0 m["totalList"] = []CompareResult{} util.ResponseFormat(c,code.CompareResultGone,m) } 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\":[\"alarmRules.alarmLevel^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}}]," } 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\":{\"baseInfo.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" var setApi dbapi.SysSetApi _, sysconf := setApi.GetServerInfo() analyServerFilterStr := "{\"term\":{\"analyServerId\":\"" + sysconf.ServerId + "\"}}," //请求体 prama := "{\"from\":\"" + esFrom + "\",\"size\":\"" + esSize + "\"," + // prama := "{\"size\":\"0\"," + "\"query\":{\"bool\":{" + queryStr + "\"filter\":[" + cameraIdStr + taskIdStr + isCollectionStr + 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\"]}" 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 }