package controllers
|
|
import (
|
"basic.com/dbapi.git"
|
"fmt"
|
"strconv"
|
"strings"
|
|
"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 []int) ([]string) {
|
d := dbapi.DicApi{}
|
res,data := d.FindByType("ALARMLEVEL")
|
if data == nil {
|
fmt.Println("dsadasd")
|
}
|
fmt.Println(res)
|
// fmt.Println(data)
|
alarmLevel := make(map[int]string)
|
|
tmp := data.(map[string]interface{})
|
for _,value := range tmp["ALARMLEVEL"].([]interface{}) {
|
// fmt.Println(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 {
|
fmt.Println("dsadas")
|
}
|
alarmLevel[vl] = name
|
}
|
alarmLevelRes := make([]string,len(alarmlevel))
|
for i,v := range alarmlevel {
|
alarmLevelRes[i] = alarmLevel[v]
|
}
|
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(webPage * 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\":[\"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"].([]interface{})[0].(string)
|
lteDate := searchBody["searchTime"].([]interface{})[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 := ""
|
defenceStateStr = ""
|
if len(alarmLevelId) > 0 {
|
flag := false
|
for i,v := range alarmLevelId {
|
if v == -1 {
|
alarmLevelId = append(alarmLevel[:i], alarmLevel[i+1:]...)
|
defenceStateStr = "{\"term\":{\"alarmRules.defenceState\":false}},"
|
flag = true
|
breake
|
}
|
}
|
if len(alarmLevelId) > 0{
|
if flag == false {
|
defenceStateStr = "{\"term\":{\"alarmRules.defenceState\":true}},"
|
}
|
id := strings.Replace(strings.Trim(fmt.Sprint(getAlarmLevel(alarmLevel)), "[]"), " ", "\",\"", -1)
|
alarmLevelStr = "{\"terms\":{\"alarmRules.alarmLevel\":[\"" + id + "\"]}},"
|
}
|
}
|
|
//使用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 +
|
defenceStateStr +
|
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\"]" +
|
"}"
|
fmt.Println(prama)
|
//数据解析
|
tokenRes := esutil.GetEsDataReq(url, prama, true)
|
return tokenRes
|
}
|
|
//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)
|
//fmt.Println(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)
|
}
|
//fmt.Println(personRes)
|
if len(personRes) < 1 {
|
personRes["personName"] = ""
|
personRes["phoneNum"] = ""
|
personRes["sex"] = ""
|
}
|
return personRes
|
}*/
|