170 lines
7.2 KiB
Go
170 lines
7.2 KiB
Go
|
package model
|
|||
|
|
|||
|
import (
|
|||
|
"encoding/json"
|
|||
|
|
|||
|
"gopkg.in/olivere/elastic.v5"
|
|||
|
)
|
|||
|
|
|||
|
// QueryParams .
|
|||
|
type QueryParams struct {
|
|||
|
Business string `form:"business" params:"business;Required" validate:"required"`
|
|||
|
QueryBodyStr string `form:"query" params:"query;Required" validate:"required"`
|
|||
|
DebugLevel int `form:"debug_level" params:"debug_level" default:"0"` // 2 默认全局debug,(包含dsl执行后的分析),1 dsl执行前的分析,防止504啥分析看不到。通过 /x/admin/search/query/debug (※包含es query体是否正确 + dsl体 + explain 返回信息) 方式,非签名请求
|
|||
|
QueryBody *QueryBody
|
|||
|
AppIDConf *QueryConfDetail
|
|||
|
}
|
|||
|
|
|||
|
// QueryBody .
|
|||
|
type QueryBody struct {
|
|||
|
Fields []string `json:"fields"` // default:"*" _source,default = *
|
|||
|
From string `json:"from"` //索引名,多个用逗号隔开
|
|||
|
Where *QueryBodyWhere `json:"where"`
|
|||
|
Order []map[string]string `json:"order"`
|
|||
|
OrderScoreFirst bool `json:"order_score_first"`
|
|||
|
OrderRandomSeed string `json:"order_random_seed"` // 随机排序种子
|
|||
|
Scroll bool `json:"scroll"`
|
|||
|
Highlight bool `json:"highlight"` //default:"false"
|
|||
|
Pn int `json:"pn"` //Range(1,5000) default:"1"
|
|||
|
Ps int `json:"ps"` //Range(1,1000) default:"10"
|
|||
|
}
|
|||
|
|
|||
|
// QueryBodyWhere .
|
|||
|
type QueryBodyWhere struct {
|
|||
|
EQ map[string]interface{} `json:"eq"` //可能是数据或字符,[12,333,67] ["asd", "你好"]
|
|||
|
Or map[string]interface{} `json:"or"` //暂时不支持minimum should
|
|||
|
In map[string][]interface{} `json:"in"` //TODO改造为slice
|
|||
|
Range map[string]string `json:"range"` //[10,20) (2018-05-10 00:00:00,2018-05-31 00:00:00] (,30]
|
|||
|
Like []QueryBodyWhereLike `json:"like"`
|
|||
|
Enhanced []QueryBodyWhereEnhanced `json:"enhanced"` //包含GourpBy Collapse
|
|||
|
Combo []QueryBodyWhereCombo `json:"combo"` //混合与或
|
|||
|
Not map[string]map[string]bool `json:"not"` //对eq、in、range条件取反
|
|||
|
}
|
|||
|
|
|||
|
// QueryBodyWhereLike .
|
|||
|
type QueryBodyWhereLike struct {
|
|||
|
KWFields []string `json:"kw_fields"`
|
|||
|
KW []string `json:"kw"` //将kw的值使用空白间隔给query
|
|||
|
Or bool `json:"or"` //default:"false"
|
|||
|
Level string `json:"level"` //默认default
|
|||
|
}
|
|||
|
|
|||
|
// QueryBodyWhereEnhanced .
|
|||
|
type QueryBodyWhereEnhanced struct {
|
|||
|
Mode string `json:"mode"`
|
|||
|
Field string `json:"field"`
|
|||
|
Order []map[string]string `json:"order"`
|
|||
|
Size int `json:"size"` //todo:sdk增加子集返回数
|
|||
|
// more conditions...
|
|||
|
}
|
|||
|
|
|||
|
// QueryBodyWhereCombo .
|
|||
|
type QueryBodyWhereCombo struct {
|
|||
|
EQ []map[string]interface{} `json:"eq"`
|
|||
|
In []map[string][]interface{} `json:"in"`
|
|||
|
Range []map[string]string `json:"range"`
|
|||
|
NotEQ []map[string]interface{} `json:"not_eq"`
|
|||
|
NotIn []map[string][]interface{} `json:"not_in"`
|
|||
|
NotRange []map[string]string `json:"not_range"`
|
|||
|
Min struct {
|
|||
|
EQ int `json:"eq"`
|
|||
|
In int `json:"in"`
|
|||
|
Range int `json:"range"`
|
|||
|
NotEQ int `json:"not_eq"`
|
|||
|
NotIn int `json:"not_in"`
|
|||
|
NotRange int `json:"not_range"`
|
|||
|
Min int `json:"min"`
|
|||
|
} `json:"min"`
|
|||
|
}
|
|||
|
|
|||
|
// QueryConfDetail .
|
|||
|
type QueryConfDetail struct {
|
|||
|
ESCluster string
|
|||
|
IndexPrefix string
|
|||
|
IndexType string
|
|||
|
IndexID string
|
|||
|
IndexMapping string
|
|||
|
MaxIndicesNum int
|
|||
|
QueryMode int //1:默认完全走查询体 2:基于查询体的定制 3:nested查询
|
|||
|
MaxPageSize int //最大page size
|
|||
|
}
|
|||
|
|
|||
|
// QueryResult query result.
|
|||
|
type QueryResult struct {
|
|||
|
Order string `json:"order"`
|
|||
|
Sort string `json:"sort"`
|
|||
|
Result json.RawMessage `json:"result"`
|
|||
|
Debug *QueryDebugResult `json:"debug"`
|
|||
|
Page *Page `json:"page"`
|
|||
|
}
|
|||
|
|
|||
|
// QueryDebugResult query result.
|
|||
|
type QueryDebugResult struct {
|
|||
|
ErrMsg []string `json:"err_msg"`
|
|||
|
QueryBody string `json:"query_body"`
|
|||
|
DSL string `json:"dsl"`
|
|||
|
Mapping map[string]interface{} `json:"mapping"`
|
|||
|
Profile *elastic.SearchProfile `json:"profile"` //性能分析
|
|||
|
}
|
|||
|
|
|||
|
// AddErrMsg .
|
|||
|
func (qdr *QueryDebugResult) AddErrMsg(msg ...string) {
|
|||
|
qdr.ErrMsg = append(qdr.ErrMsg, msg...)
|
|||
|
}
|
|||
|
|
|||
|
// UpsertResult upsert result.
|
|||
|
type UpsertResult struct {
|
|||
|
}
|
|||
|
|
|||
|
var (
|
|||
|
// QueryModeBasic completely using basic query & nested .
|
|||
|
QueryModeBasic = 1
|
|||
|
// QueryModeExtra write some extra conditions under basic query .
|
|||
|
QueryModeExtra = 2
|
|||
|
|
|||
|
// EnhancedModeGroupBy group by .
|
|||
|
EnhancedModeGroupBy = "group_by"
|
|||
|
// EnhancedModeSum sum from a filed .
|
|||
|
EnhancedModeSum = "sum"
|
|||
|
// EnhancedModeCollapse collapse .
|
|||
|
EnhancedModeCollapse = "collapse"
|
|||
|
// EnhancedModeDistinct distinct .
|
|||
|
EnhancedModeDistinct = "distinct"
|
|||
|
// EnhancedModeDistinctCount distinct .
|
|||
|
EnhancedModeDistinctCount = "distinct_count"
|
|||
|
// EnhancedModeGroupBySum group by sum .
|
|||
|
EnhancedModeGroupBySum = "group_by_sum"
|
|||
|
// EnhancedModeGroupByTop top hits .
|
|||
|
EnhancedModeGroupByTop = "group_by_tophits"
|
|||
|
|
|||
|
// LikeLevelHigh high level .
|
|||
|
LikeLevelHigh = "high"
|
|||
|
// LikeLevelMiddel middle level .
|
|||
|
LikeLevelMiddel = "middle"
|
|||
|
// LikeLevelLow low level .
|
|||
|
LikeLevelLow = "low"
|
|||
|
|
|||
|
// QueryConf 自定义部分
|
|||
|
QueryConf = map[string]*QueryConfDetail{
|
|||
|
"archive_video_score": {ESCluster: "ssd_archive", IndexPrefix: "archive_video", MaxIndicesNum: 1, QueryMode: QueryModeExtra},
|
|||
|
"archive_score": {ESCluster: "ssd_archive", IndexPrefix: "archive", MaxIndicesNum: 1, QueryMode: QueryModeExtra},
|
|||
|
"task_qa_random": {ESCluster: "internalPublic", IndexPrefix: "task_qa", MaxIndicesNum: 1, QueryMode: QueryModeExtra},
|
|||
|
"esports_contests_date": {ESCluster: "pcie_pub_out01", IndexPrefix: "esports_contests_map", MaxIndicesNum: 1, QueryMode: QueryModeExtra},
|
|||
|
"creative_archive_search": {ESCluster: "pcie_pub_out01", IndexPrefix: "creative_archive", MaxIndicesNum: 1, QueryMode: QueryModeExtra},
|
|||
|
"creative_archive_staff": {ESCluster: "pcie_pub_out02", IndexPrefix: "creative_archive", IndexID: "%d,id", IndexType: "base", MaxIndicesNum: 1, QueryMode: QueryModeExtra},
|
|||
|
"creative_archive_apply": {ESCluster: "pcie_pub_out02", IndexPrefix: "creative_archive", MaxIndicesNum: 1, QueryMode: QueryModeExtra},
|
|||
|
"dm_history": {ESCluster: "dmout", IndexPrefix: "dm_search", MaxIndicesNum: 1, QueryMode: QueryModeExtra},
|
|||
|
// "pgc_contract_info": {ESCluster: "pcie_pub_out01", IndexPrefix: "pgc_contract_info", MaxIndicesNum: 1, QueryMode: QueryModeNested},
|
|||
|
// "pgc_contract_video": {ESCluster: "pcie_pub_out01", IndexPrefix: "pgc_contract_video", MaxIndicesNum: 1, QueryMode: QueryModeNested},
|
|||
|
}
|
|||
|
|
|||
|
// PermConf 权限业务
|
|||
|
PermConf = map[string]map[string]string{
|
|||
|
"star": {"ops_log_billions": "true"}, // 业务使用*批量获取索引
|
|||
|
"scroll": {"dm_search": "true"}, // 业务使用scroll
|
|||
|
"oht": {"creative_reply": "true", "creative_reply_isreport": "true", "esports": "true"}, // 业务max_result_window 100k
|
|||
|
"es_cache": {"comics_firebird": "true", "pgc_media": "true", "pgc_season": "true"}, // request cache(失效时间和索引的refresh_interval一致)
|
|||
|
//"routing": {"creative_reply": "o_mid"},
|
|||
|
}
|
|||
|
)
|