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.VideoPersons.IndexName + "," + config.EsInfo.EsIndex.Personaction.IndexName
|
queryStr := ""
|
queryBody := searchBody.InputValue
|
//检索框
|
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^3.0\",\"ageDescription^1.5\",\"taskName^1.5\",\"baseInfo.tableName^1.0\",\"sex^2.0\",\"race^2.0\",\"content^1.0\",\"baseInfo.idCard^1.8\",\"cameraAddr^2.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
|
if searchTime == nil || len(searchTime) < 2 {
|
info := make(map[string]interface{}, 0)
|
info["err"] = "请输入时间范围"
|
return info
|
}
|
|
gteDate := searchTime[0]
|
lteDate := searchTime[1]
|
|
//判断人员ID
|
personIdStr := ""
|
//personId := searchBody.Id
|
personId := []string{}
|
if personId != nil && len(personId) > 0 {
|
esPersonId := strings.Replace(strings.Trim(fmt.Sprint(personId), "[]"), " ", "\",\"", -1)
|
personIdStr = "{\"terms\":{\"id\":[\"" + esPersonId + "\"]}},"
|
}
|
|
//判断任务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)
|
index = config.EsInfo.EsIndex.VideoPersons.IndexName
|
esTableIdStr = "{\"terms\":{\"baseInfo.tableId\":[\"" + esTableId + "\"]}},"
|
}
|
//判断收藏状态
|
isCollectStr := ""
|
isCollect := searchBody.Collection
|
if isCollect != "" {
|
isCollectStr = "{\"term\":{\"isCollect\":\"" + isCollect + "\"}},"
|
}
|
//判断布防等级id
|
alarmLevelId := searchBody.AlarmLevel
|
alarmLevelStr := ""
|
if len(alarmLevelId) > 0 {
|
alarmLevelTypes := strings.Replace(strings.Trim(fmt.Sprint(getAlarmLevel(alarmLevelId)), "[]"), " ", "\",\"", -1)
|
alarmLevelStr = "{\"terms\":{\"alarmRules.alarmLevel\":[\"" + 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 + "\"}},"
|
|
//请求体
|
prama := "{\"from\":\"" + from + "\"," +
|
"\"size\":\"" + size + "\"," +
|
"\"query\":{\"bool\":{" + queryStr +
|
"\"filter\":[" +
|
cameraIdStr +
|
alarmLevelStr +
|
personIdStr +
|
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{} {
|
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)) +
|
"/" + config.EsInfo.EsIndex.VideoPersons.IndexName + "," + config.EsInfo.EsIndex.Personaction.IndexName + "/_search?search_type=dfs_query_then_fetch"
|
jsonDSL := "{\"query\":{\"bool\":{\"filter\":[{\"term\":{\"linkId\":\"" + 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
|
}*/
|