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
|
}
|
databases := searchBody.DataBases
|
from := 0
|
to := 0
|
|
data := make(map[string]interface{})
|
searchBody.Page = 1
|
searchBody.Size = 15000
|
|
if len(databases) == 1 && databases[0] == "esData" {
|
searchBody.IsAggs = false
|
} else {
|
data = service.QueryDbPersonsForCompare(*searchBody)
|
}
|
sources := data["datalist"].([]interface{})
|
|
if len(sources) > 0 {
|
//进行比对
|
} else {
|
fmt.Println("查询条件下无数据 source 数据为空:" + string(len(sources)))
|
}
|
dataLen := len(sources)
|
if from > dataLen-1 {
|
from = 0
|
to = 0
|
}
|
if to > dataLen {
|
to = dataLen
|
}
|
|
dmap := make(map[string]interface{}, 2)
|
dmap["datalist"] = sources
|
dmap["total"] = dataLen
|
util.ResponseFormat(c, code.Success, dmap)
|
|
}
|
|
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
|
}
|