|
@@ -22,6 +22,8 @@ var (
|
|
|
MATimeout int
|
|
|
MAProjectNumLimit int
|
|
|
MAKeyWordsCount int
|
|
|
+ MinKeyWordsCount int //关键词数量最低值 小于此数量,默认走线上
|
|
|
+ MaxPCount int //项目最大限制数量
|
|
|
ProjectCount int
|
|
|
PtIndex = "projectset"
|
|
|
PtType = "projectset"
|
|
@@ -29,7 +31,7 @@ var (
|
|
|
Fields = `"projectname.pname"`
|
|
|
)
|
|
|
|
|
|
-func MAInit(limit, timeOut, projectNumLimit, keyWordsCount, pCount int, ptIndex, ptType string, fields []string) {
|
|
|
+func MAInit(limit, timeOut, projectNumLimit, keyWordsCount, pCount, minKCount, maxPCount int, ptIndex, ptType string, fields []string) {
|
|
|
if limit == 0 {
|
|
|
limit = 5
|
|
|
}
|
|
@@ -49,6 +51,15 @@ func MAInit(limit, timeOut, projectNumLimit, keyWordsCount, pCount int, ptIndex,
|
|
|
keyWordsCount = 300
|
|
|
}
|
|
|
MAKeyWordsCount = keyWordsCount
|
|
|
+
|
|
|
+ if minKCount <= 0 {
|
|
|
+ minKCount = 100
|
|
|
+ }
|
|
|
+ MinKeyWordsCount = minKCount
|
|
|
+ if maxPCount <= 0 {
|
|
|
+ maxPCount = 5000000
|
|
|
+ }
|
|
|
+ MaxPCount = maxPCount
|
|
|
//项目数量
|
|
|
ProjectCount = pCount
|
|
|
//es 索引
|
|
@@ -674,15 +685,52 @@ func (a *AnalysisEntity) GetPartResult(flag int) (map[string]interface{}, error)
|
|
|
return rData, err
|
|
|
}
|
|
|
|
|
|
+// 离线 获取采购单位和中部单位数据
|
|
|
+func (a *AnalysisEntity) BWData() (buyers []string, winners []string) {
|
|
|
+ sql := `"buyer_terms": {"terms": {"field": "buyer","size": 50000}},"winner_terms": {"terms": {"field": "winner","size": 50000}}`
|
|
|
+ finalSql := fmt.Sprintf(a.GetCommonQuerySqlWithAggs(), sql)
|
|
|
+ res := GetAggs(PtIndex, PtType, finalSql)
|
|
|
+ if res == nil || len(res) == 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var bw = BWBuckets{}
|
|
|
+ for name, object := range res {
|
|
|
+ bArr, err := object.MarshalJSON()
|
|
|
+ if len(bArr) == 0 || err != nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if name == "buyer_terms" {
|
|
|
+ if json.Unmarshal(bArr, &bw.Buyerterms) != nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ } else if name == "winner_terms" {
|
|
|
+ if json.Unmarshal(bArr, &bw.Winnerterms) != nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for _, bv := range bw.Buyerterms.Buckets {
|
|
|
+ buyers = append(buyers, bv.Key)
|
|
|
+ }
|
|
|
+ for _, wv := range bw.Winnerterms.Buckets {
|
|
|
+ winners = append(winners, wv.Key)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
// 实时查询
|
|
|
func (a *AnalysisEntity) RealTimeQuery(flag int) (map[string]interface{}, error) {
|
|
|
switch flag {
|
|
|
case MarketScaleMain:
|
|
|
rData, err := a.MarketTime()
|
|
|
//非离线
|
|
|
- if a.Offline != 1 && err != nil { //若无报告内容,删除报告记录
|
|
|
+ if a.Offline != ValueOffline && err != nil { //若无报告内容,删除报告记录
|
|
|
go a.removeEmptyRecord()
|
|
|
}
|
|
|
+ if a.Offline == ValueOffline {
|
|
|
+ //采购单位和中部单位 数据
|
|
|
+ rData["buyers"], rData["winners"] = a.BWData()
|
|
|
+ }
|
|
|
return rData, err
|
|
|
case MarketTopProject:
|
|
|
return a.ProjectTop10()
|
|
@@ -769,8 +817,19 @@ func (a *AnalysisEntity) GetAnalyzingReport() string {
|
|
|
}
|
|
|
|
|
|
// IsOffline 判断是否符合在线分析的条件
|
|
|
-func (a *AnalysisEntity) IsOffline() (offline bool) {
|
|
|
+func (a *AnalysisEntity) IsOffline() {
|
|
|
//离线生成:订阅词(关键词+排除词)超过300个(数量支持配置),或单次分析数据超过60万条,则离线生成;
|
|
|
+ // 查询数据量
|
|
|
+ countSql := fmt.Sprintf(a.GetCommonQuerySql(), "")
|
|
|
+ log.Println("IsOffline count SQL:", countSql)
|
|
|
+ now := time.Now()
|
|
|
+ dataCount := elastic.Count(PtIndex, PtType, countSql)
|
|
|
+ if dataCount > int64(MaxPCount) { //提示用户 数据量过大,修改生成报告条件
|
|
|
+ a.Offline = ValueError
|
|
|
+ return
|
|
|
+ }
|
|
|
+ log.Println("IsOffline 数据量:", dataCount)
|
|
|
+ a.OriginalTotal = dataCount
|
|
|
keyCount := 0
|
|
|
for i := 0; i < len(a.FormatParam.KeysItems); i++ {
|
|
|
items := a.FormatParam.KeysItems[i]
|
|
@@ -787,36 +846,31 @@ func (a *AnalysisEntity) IsOffline() (offline bool) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ a.KeysTotal = int64(keyCount)
|
|
|
+ //关键词数量 < 100 ,默认走线上
|
|
|
+ if keyCount < MinKeyWordsCount {
|
|
|
+ a.Offline = ValueRealTime
|
|
|
+ return
|
|
|
+ }
|
|
|
if keyCount > MAKeyWordsCount {
|
|
|
// 查询配置
|
|
|
if mac := a.getMarUserAccount(); mac != nil {
|
|
|
if keyCount >= mac.Threshold {
|
|
|
a.Offline = ValueOffline
|
|
|
- a.KeysTotal = int64(keyCount)
|
|
|
- return true
|
|
|
+ return
|
|
|
}
|
|
|
} else {
|
|
|
a.Offline = ValueOffline
|
|
|
- a.KeysTotal = int64(keyCount)
|
|
|
- return true
|
|
|
+ return
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- // 查询数据量
|
|
|
- countSql := fmt.Sprintf(a.GetCommonQuerySql(), "")
|
|
|
- log.Println("IsOffline count SQL:", countSql)
|
|
|
- now := time.Now()
|
|
|
- dataCount := elastic.Count(PtIndex, PtType, countSql)
|
|
|
- b := time.Since(now)
|
|
|
- log.Println("IsOffline 统计数据量耗时:", b)
|
|
|
- log.Println("IsOffline 数据量:", dataCount)
|
|
|
- a.OriginalTotal = dataCount
|
|
|
+ log.Println("IsOffline 统计数据量耗时:", time.Since(now))
|
|
|
if int(dataCount) > MAProjectNumLimit {
|
|
|
a.Offline = ValueOffline
|
|
|
- return true
|
|
|
+ return
|
|
|
}
|
|
|
a.Offline = ValueRealTime
|
|
|
- return false
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
type MarUserAccount struct {
|