蛋蛋星球 后台端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1488 lines
59 KiB

  1. package egg_energy
  2. import (
  3. md2 "applet/app/md/institutional_management/egg_energy"
  4. "applet/app/utils"
  5. "code.fnuoos.com/EggPlanet/egg_system_rules.git/md"
  6. "code.fnuoos.com/go_rely_warehouse/zyos_go_es.git/es"
  7. "context"
  8. "encoding/json"
  9. "errors"
  10. "fmt"
  11. "github.com/olivere/elastic/v7"
  12. "strconv"
  13. "strings"
  14. )
  15. // 查询Elasticsearch并返回结果
  16. func QueryElasticsearch(req md2.UserEggFlowReq, indexName string) (resp []md2.UserEggFlowReqRespList, total int64, err error) {
  17. // 构建查询条件
  18. boolQuery := elastic.NewBoolQuery()
  19. if req.ScoreValueStart != "" && req.ScoreValueEnd != "" {
  20. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("score_value").Gte(req.ScoreValueStart).Lte(req.ScoreValueEnd))
  21. }
  22. if req.EcpmStart != "" && req.EcpmEnd != "" {
  23. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("ecpm").Gte(req.EcpmStart).Lte(req.EcpmEnd))
  24. }
  25. if req.InviteUserNumsStart != "" && req.InviteUserNumsEnd != "" {
  26. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("invite_user_nums").Gte(req.InviteUserNumsStart).Lte(req.InviteUserNumsEnd))
  27. }
  28. if req.TeamActivityNumsStart != "" && req.TeamActivityNumsEnd != "" {
  29. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("team_activity_nums").Gte(req.TeamActivityNumsStart).Lte(req.TeamActivityNumsEnd))
  30. }
  31. if req.SignInNumsStart != "" && req.SignInNumsEnd != "" {
  32. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("sign_in_nums").Gte(req.SignInNumsStart).Lte(req.SignInNumsEnd))
  33. }
  34. if req.ImActivityNumsStart != "" && req.ImActivityNumsEnd != "" {
  35. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("im_activity_nums").Gte(req.ImActivityNumsStart).Lte(req.ImActivityNumsEnd))
  36. }
  37. if req.SendRedPackageNumsStart != "" && req.SendRedPackageNumsEnd != "" {
  38. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("send_red_package_nums").Gte(req.SendRedPackageNumsStart).Lte(req.SendRedPackageNumsEnd))
  39. }
  40. if req.EggEnergyExchangeAccountBalanceStart != "" && req.EggEnergyExchangeAccountBalanceEnd != "" {
  41. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("egg_energy_exchange_account_balance").Gte(req.EggEnergyExchangeAccountBalanceStart).Lte(req.EggEnergyExchangeAccountBalanceEnd))
  42. }
  43. if req.AccountBalanceExchangeEggEnergyNumsStart != "" && req.AccountBalanceExchangeEggEnergyNumsEnd != "" {
  44. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("account_balance_exchange_egg_energy_nums").Gte(req.AccountBalanceExchangeEggEnergyNumsStart).Lte(req.AccountBalanceExchangeEggEnergyNumsEnd))
  45. }
  46. if req.SendCircleOfFriendNumsStart != "" && req.SendCircleOfFriendNumsEnd != "" {
  47. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("send_circle_of_friend_nums").Gte(req.SendCircleOfFriendNumsStart).Lte(req.SendCircleOfFriendNumsEnd))
  48. }
  49. if req.ForumCommentsNumsStart != "" && req.ForumCommentsNumsEnd != "" {
  50. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("forum_comments_nums").Gte(req.ForumCommentsNumsStart).Lte(req.ForumCommentsNumsEnd))
  51. }
  52. if req.CollegeLearningNumsStart != "" && req.CollegeLearningNumsEnd != "" {
  53. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("college_learning_nums").Gte(req.CollegeLearningNumsStart).Lte(req.CollegeLearningNumsEnd))
  54. }
  55. if req.ViolateNumsStart != "" && req.ViolateNumsEnd != "" {
  56. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("violate_nums").Gte(req.ViolateNumsStart).Lte(req.ViolateNumsEnd))
  57. }
  58. if req.BrowseInterfaceNumsStart != "" && req.BrowseInterfaceNumsEnd != "" {
  59. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("browse_interface_nums").Gte(req.BrowseInterfaceNumsStart).Lte(req.BrowseInterfaceNumsEnd))
  60. }
  61. if req.PersonAddActivityValueStart != "" && req.PersonAddActivityValueEnd != "" {
  62. boolQuery = boolQuery.Filter(elastic.NewRangeQuery("person_add_activity_value").Gte(req.PersonAddActivityValueStart).Lte(req.PersonAddActivityValueEnd))
  63. }
  64. // 执行查询
  65. searchResult, err := es.EsClient.Search().
  66. Index(indexName).
  67. Query(boolQuery).
  68. From((req.Page - 1) * req.PageSize).Size(req.PageSize).
  69. Pretty(true).
  70. Do(context.Background())
  71. if err != nil {
  72. if strings.Contains(err.Error(), "no such index") {
  73. return nil, 0, nil
  74. }
  75. return
  76. }
  77. // 检查是否有结果
  78. if searchResult.Hits.TotalHits.Value == 0 {
  79. return
  80. }
  81. // 解析结果
  82. for _, hit := range searchResult.Hits.Hits {
  83. var doc md2.UserEggFlowReqRespList
  84. err = json.Unmarshal(hit.Source, &doc)
  85. if err != nil {
  86. return
  87. }
  88. doc.IndexId = hit.Id
  89. resp = append(resp, doc)
  90. }
  91. total = searchResult.Hits.TotalHits.Value
  92. return
  93. }
  94. // StatisticsUserEggScoreValueRange 统计用户蛋蛋分范围
  95. func StatisticsUserEggScoreValueRange(esIndexName string) (resp []map[string]string, err error) {
  96. resp = []map[string]string{}
  97. var result *elastic.SearchResult
  98. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  99. // 1、 创建 extended_stats 高级统计
  100. aggs := elastic.NewExtendedStatsAggregation().Field("score_value")
  101. result, err = es.EsClient.Search().
  102. Index(esIndexName).
  103. TrackTotalHits(true).
  104. Query(boolQuery). // 设置查询条件
  105. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  106. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  107. Pretty(true). // 返回可读的json格式
  108. Do(context.Background())
  109. if err != nil {
  110. return resp, err
  111. }
  112. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  113. agg, found := result.Aggregations.ExtendedStats("result")
  114. if !found {
  115. // 打印结果,注意:这里使用的是取值运算符
  116. return resp, errors.New("未聚合出数据")
  117. }
  118. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  119. //2、histogram 直方图聚合
  120. stdDeviation := *agg.StdDeviation //标准平方差
  121. min := *agg.Min //最小值
  122. max := *agg.Max //最大值
  123. avg := *agg.Avg //平均数
  124. totalCount := agg.Count //总数
  125. discreteCoefficient := stdDeviation / avg //离散系数
  126. newAggs := elastic.NewHistogramAggregation().Field("score_value").Interval(discreteCoefficient).ExtendedBounds(min, max)
  127. searchResult, err := es.EsClient.Search().
  128. Index(esIndexName).
  129. TrackTotalHits(true).
  130. Query(boolQuery). // 设置查询条件
  131. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  132. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  133. Pretty(true). // 返回可读的json格式
  134. Do(context.Background())
  135. if err != nil {
  136. return resp, err
  137. }
  138. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  139. newAgg, found := searchResult.Aggregations.Histogram("result")
  140. if !found {
  141. return resp, errors.New("未聚合出数据")
  142. }
  143. // 3、组装数据
  144. var keys []string
  145. var values []int64
  146. var tempTotalDocCount int64
  147. var endStart, endEnd string
  148. for _, bucket := range newAgg.Buckets {
  149. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  150. if bucket.Key <= stdDeviation {
  151. bucketValue := bucket.Key
  152. keys = append(keys, utils.Float64ToStr(bucketValue))
  153. values = append(values, bucket.DocCount)
  154. } else {
  155. bucketValue := bucket.Key
  156. if tempTotalDocCount == 0 {
  157. endStart = utils.Float64ToStr(bucketValue)
  158. }
  159. tempTotalDocCount += bucket.DocCount
  160. endEnd = utils.Float64ToStr(bucketValue)
  161. }
  162. }
  163. for k, v := range keys {
  164. value, _ := Operate(values[k], totalCount)
  165. if k+1 == len(keys) {
  166. resp = append(resp, map[string]string{
  167. "key": v + " ~ " + utils.AnyToString(max) + " 元",
  168. "value": utils.Float64ToStrPrec10(value),
  169. })
  170. } else {
  171. resp = append(resp, map[string]string{
  172. "key": v + " ~ " + keys[k+1] + " 元",
  173. "value": utils.Float64ToStrPrec10(value),
  174. })
  175. }
  176. }
  177. if tempTotalDocCount > 0 {
  178. temp, _ := Operate(tempTotalDocCount, totalCount)
  179. resp = append(resp, map[string]string{
  180. "key": endStart + " ~ " + endEnd + " 元",
  181. "value": utils.Float64ToStrPrec10(temp),
  182. })
  183. }
  184. }
  185. return resp, nil
  186. }
  187. // StatisticsUserEggKindProportion 统计用户蛋蛋分"评比类型"占比
  188. func StatisticsUserEggKindProportion(esIndexName string) (result []map[string]interface{}, err error) {
  189. var res *elastic.SearchResult
  190. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  191. aggs := elastic.NewTermsAggregation().Field("score_value_kind")
  192. res, err = es.EsClient.Search().
  193. Index(esIndexName).
  194. TrackTotalHits(true).
  195. Query(boolQuery). // 设置查询条件
  196. Aggregation("terms", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  197. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  198. Pretty(true). // 返回可读的json格式
  199. Do(context.Background())
  200. if err != nil {
  201. return result, err
  202. }
  203. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  204. agg, _ := res.Aggregations.Terms("terms")
  205. var total float64
  206. for _, bucket := range agg.Buckets {
  207. var tmp = map[string]interface{}{}
  208. bucketValue := bucket.Key
  209. tmp["key"] = bucketValue
  210. tmp["count"] = bucket.DocCount
  211. switch bucketValue {
  212. case 1:
  213. tmp["name"] = "人工"
  214. break
  215. case 2:
  216. tmp["name"] = "自动"
  217. break
  218. default:
  219. tmp["name"] = "未知"
  220. }
  221. result = append(result, tmp)
  222. total += utils.AnyToFloat64(bucket.DocCount)
  223. }
  224. for _, value := range result {
  225. value["proportion"] = utils.AnyToString(utils.AnyToFloat64(value["count"]) / total)
  226. }
  227. return result, nil
  228. }
  229. // StatisticsUserEggEcpmRange 统计用户"ecpm"范围
  230. func StatisticsUserEggEcpmRange(esIndexName string) (resp []map[string]string, err error) {
  231. resp = []map[string]string{}
  232. var result *elastic.SearchResult
  233. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  234. // 1、 创建 extended_stats 高级统计
  235. aggs := elastic.NewExtendedStatsAggregation().Field("ecpm")
  236. result, err = es.EsClient.Search().
  237. Index(esIndexName).
  238. TrackTotalHits(true).
  239. Query(boolQuery). // 设置查询条件
  240. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  241. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  242. Pretty(true). // 返回可读的json格式
  243. Do(context.Background())
  244. if err != nil {
  245. return resp, err
  246. }
  247. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  248. agg, found := result.Aggregations.ExtendedStats("result")
  249. if !found {
  250. // 打印结果,注意:这里使用的是取值运算符
  251. return resp, errors.New("未聚合出数据")
  252. }
  253. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  254. //2、histogram 直方图聚合
  255. stdDeviation := *agg.StdDeviation //标准平方差
  256. min := *agg.Min //最小值
  257. max := *agg.Max //最大值
  258. avg := *agg.Avg //平均数
  259. totalCount := agg.Count //总数
  260. discreteCoefficient := stdDeviation / avg //离散系数
  261. if stdDeviation < avg {
  262. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  263. discreteCoefficient = stdDeviation
  264. }
  265. newAggs := elastic.NewHistogramAggregation().Field("ecpm").Interval(discreteCoefficient).ExtendedBounds(min, max)
  266. searchResult, err := es.EsClient.Search().
  267. Index(esIndexName).
  268. TrackTotalHits(true).
  269. Query(boolQuery). // 设置查询条件
  270. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  271. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  272. Pretty(true). // 返回可读的json格式
  273. Do(context.Background())
  274. if err != nil {
  275. return resp, err
  276. }
  277. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  278. newAgg, found := searchResult.Aggregations.Histogram("result")
  279. if !found {
  280. return resp, errors.New("未聚合出数据")
  281. }
  282. // 3、组装数据
  283. var keys []string
  284. var values []int64
  285. for _, bucket := range newAgg.Buckets {
  286. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  287. bucketValue := bucket.Key
  288. keys = append(keys, utils.Float64ToStr(bucketValue))
  289. values = append(values, bucket.DocCount)
  290. }
  291. for k, v := range keys {
  292. value, _ := Operate(values[k], totalCount)
  293. if k+1 == len(keys) {
  294. resp = append(resp, map[string]string{
  295. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  296. "value": utils.Float64ToStrPrec10(value),
  297. })
  298. } else {
  299. resp = append(resp, map[string]string{
  300. "key": v + " ~ " + keys[k+1] + " 元",
  301. "value": utils.Float64ToStrPrec10(value),
  302. })
  303. }
  304. }
  305. }
  306. return resp, nil
  307. }
  308. func StatisticsUserEggEcpmRange1(esIndexName string) (resp []map[string]string, err error) {
  309. resp = []map[string]string{}
  310. var result *elastic.SearchResult
  311. // 创建百分位数聚合
  312. percentBoolQuery := elastic.NewRangeQuery("ecpm").Gt(0)
  313. percentilesAgg := elastic.NewPercentilesAggregation().Field("ecpm").Percentiles([]float64{5, 90}...)
  314. // 执行查询
  315. response, err := es.EsClient.Search().
  316. Index(esIndexName).
  317. Query(percentBoolQuery).
  318. Aggregation("percentiles_agg", percentilesAgg).
  319. Size(0).
  320. Do(context.Background())
  321. if err != nil {
  322. // 处理错误
  323. return resp, err
  324. }
  325. // 获取百分位数结果
  326. percentiles, found := response.Aggregations.Percentiles("percentiles_agg")
  327. if !found {
  328. return resp, err
  329. }
  330. // 获取第10和第90百分位数
  331. p5 := percentiles.Values["5.0"]
  332. p90 := percentiles.Values["90.0"]
  333. boolQuery := elastic.NewRangeQuery("ecpm").Gte(p5).Lte(p90)
  334. // 1、 创建 extended_stats 高级统计
  335. aggs := elastic.NewExtendedStatsAggregation().Field("ecpm")
  336. result, err = es.EsClient.Search().
  337. Index(esIndexName).
  338. TrackTotalHits(true).
  339. Query(boolQuery). // 设置查询条件
  340. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  341. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  342. Pretty(true). // 返回可读的json格式
  343. Do(context.Background())
  344. if err != nil {
  345. return resp, err
  346. }
  347. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  348. agg, found := result.Aggregations.ExtendedStats("result")
  349. if !found {
  350. // 打印结果,注意:这里使用的是取值运算符
  351. return resp, errors.New("未聚合出数据")
  352. }
  353. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  354. //2、histogram 直方图聚合
  355. stdDeviation := *agg.StdDeviation //标准平方差
  356. min := *agg.Min //最小值
  357. max := *agg.Max //最大值
  358. avg := *agg.Avg //平均数
  359. totalCount := agg.Count //总数
  360. discreteCoefficient := stdDeviation / avg //离散系数
  361. if stdDeviation < avg {
  362. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  363. discreteCoefficient = stdDeviation
  364. }
  365. newAggs := elastic.NewHistogramAggregation().Field("ecpm").Interval(discreteCoefficient).MinDocCount(1).ExtendedBounds(min, max)
  366. searchResult, err := es.EsClient.Search().
  367. Index(esIndexName).
  368. TrackTotalHits(true).
  369. Query(boolQuery). // 设置查询条件
  370. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  371. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  372. Pretty(true). // 返回可读的json格式
  373. Do(context.Background())
  374. if err != nil {
  375. return resp, err
  376. }
  377. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  378. newAgg, found := searchResult.Aggregations.Histogram("result")
  379. if !found {
  380. return resp, errors.New("未聚合出数据")
  381. }
  382. // 3、组装数据
  383. var keys []string
  384. var values []int64
  385. for _, bucket := range newAgg.Buckets {
  386. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  387. bucketValue := bucket.Key
  388. keys = append(keys, utils.Float64ToStr(bucketValue))
  389. values = append(values, bucket.DocCount)
  390. }
  391. for k, v := range keys {
  392. value, _ := Operate(values[k], totalCount)
  393. if k+1 == len(keys) {
  394. resp = append(resp, map[string]string{
  395. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  396. "value": utils.Float64ToStrPrec10(value),
  397. })
  398. } else {
  399. resp = append(resp, map[string]string{
  400. "key": v + " ~ " + keys[k+1] + " 元",
  401. "value": utils.Float64ToStrPrec10(value),
  402. })
  403. }
  404. }
  405. }
  406. fmt.Println(resp)
  407. return resp, nil
  408. }
  409. // StatisticsUserEggInviteUserNumsRange 统计用户"拉新人数"范围
  410. func StatisticsUserEggInviteUserNumsRange(esIndexName string) (resp []map[string]string, err error) {
  411. resp = []map[string]string{}
  412. var result *elastic.SearchResult
  413. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  414. // 1、 创建 extended_stats 高级统计
  415. aggs := elastic.NewExtendedStatsAggregation().Field("invite_user_nums")
  416. result, err = es.EsClient.Search().
  417. Index(esIndexName).
  418. TrackTotalHits(true).
  419. Query(boolQuery). // 设置查询条件
  420. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  421. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  422. Pretty(true). // 返回可读的json格式
  423. Do(context.Background())
  424. if err != nil {
  425. return resp, err
  426. }
  427. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  428. agg, found := result.Aggregations.ExtendedStats("result")
  429. if !found {
  430. // 打印结果,注意:这里使用的是取值运算符
  431. return resp, errors.New("未聚合出数据")
  432. }
  433. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  434. //2、histogram 直方图聚合
  435. stdDeviation := *agg.StdDeviation //标准平方差
  436. min := *agg.Min //最小值
  437. max := *agg.Max //最大值
  438. avg := *agg.Avg //平均数
  439. totalCount := agg.Count //总数
  440. discreteCoefficient := stdDeviation / avg //离散系数
  441. if stdDeviation < avg {
  442. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  443. discreteCoefficient = stdDeviation
  444. }
  445. newAggs := elastic.NewHistogramAggregation().Field("invite_user_nums").Interval(discreteCoefficient).ExtendedBounds(min, max)
  446. searchResult, err := es.EsClient.Search().
  447. Index(esIndexName).
  448. TrackTotalHits(true).
  449. Query(boolQuery). // 设置查询条件
  450. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  451. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  452. Pretty(true). // 返回可读的json格式
  453. Do(context.Background())
  454. if err != nil {
  455. return resp, err
  456. }
  457. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  458. newAgg, found := searchResult.Aggregations.Histogram("result")
  459. if !found {
  460. return resp, errors.New("未聚合出数据")
  461. }
  462. // 3、组装数据
  463. var keys []string
  464. var values []int64
  465. for _, bucket := range newAgg.Buckets {
  466. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  467. bucketValue := bucket.Key
  468. keys = append(keys, utils.Float64ToStr(bucketValue))
  469. values = append(values, bucket.DocCount)
  470. }
  471. for k, v := range keys {
  472. value, _ := Operate(values[k], totalCount)
  473. if k+1 == len(keys) {
  474. resp = append(resp, map[string]string{
  475. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  476. "value": utils.Float64ToStrPrec10(value),
  477. })
  478. } else {
  479. resp = append(resp, map[string]string{
  480. "key": v + " ~ " + keys[k+1] + " 元",
  481. "value": utils.Float64ToStrPrec10(value),
  482. })
  483. }
  484. }
  485. }
  486. return resp, nil
  487. }
  488. // StatisticsUserEggTeamActivityNumsRange 统计用户"团队活跃次数"范围
  489. func StatisticsUserEggTeamActivityNumsRange(esIndexName string) (resp []map[string]string, err error) {
  490. resp = []map[string]string{}
  491. var result *elastic.SearchResult
  492. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  493. // 1、 创建 extended_stats 高级统计
  494. aggs := elastic.NewExtendedStatsAggregation().Field("team_activity_nums")
  495. result, err = es.EsClient.Search().
  496. Index(esIndexName).
  497. TrackTotalHits(true).
  498. Query(boolQuery). // 设置查询条件
  499. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  500. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  501. Pretty(true). // 返回可读的json格式
  502. Do(context.Background())
  503. if err != nil {
  504. return resp, err
  505. }
  506. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  507. agg, found := result.Aggregations.ExtendedStats("result")
  508. if !found {
  509. // 打印结果,注意:这里使用的是取值运算符
  510. return resp, errors.New("未聚合出数据")
  511. }
  512. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  513. //2、histogram 直方图聚合
  514. stdDeviation := *agg.StdDeviation //标准平方差
  515. min := *agg.Min //最小值
  516. max := *agg.Max //最大值
  517. avg := *agg.Avg //平均数
  518. totalCount := agg.Count //总数
  519. discreteCoefficient := stdDeviation / avg //离散系数
  520. if stdDeviation < avg {
  521. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  522. discreteCoefficient = stdDeviation
  523. }
  524. newAggs := elastic.NewHistogramAggregation().Field("team_activity_nums").Interval(discreteCoefficient).ExtendedBounds(min, max)
  525. searchResult, err := es.EsClient.Search().
  526. Index(esIndexName).
  527. TrackTotalHits(true).
  528. Query(boolQuery). // 设置查询条件
  529. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  530. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  531. Pretty(true). // 返回可读的json格式
  532. Do(context.Background())
  533. if err != nil {
  534. return resp, err
  535. }
  536. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  537. newAgg, found := searchResult.Aggregations.Histogram("result")
  538. if !found {
  539. return resp, errors.New("未聚合出数据")
  540. }
  541. // 3、组装数据
  542. var keys []string
  543. var values []int64
  544. for _, bucket := range newAgg.Buckets {
  545. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  546. bucketValue := bucket.Key
  547. keys = append(keys, utils.Float64ToStr(bucketValue))
  548. values = append(values, bucket.DocCount)
  549. }
  550. for k, v := range keys {
  551. value, _ := Operate(values[k], totalCount)
  552. if k+1 == len(keys) {
  553. resp = append(resp, map[string]string{
  554. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  555. "value": utils.Float64ToStrPrec10(value),
  556. })
  557. } else {
  558. resp = append(resp, map[string]string{
  559. "key": v + " ~ " + keys[k+1] + " 元",
  560. "value": utils.Float64ToStrPrec10(value),
  561. })
  562. }
  563. }
  564. }
  565. return resp, nil
  566. }
  567. // StatisticsUserEggSignInNumsRange 统计用户"签到次数"范围
  568. func StatisticsUserEggSignInNumsRange(esIndexName string) (resp []map[string]string, err error) {
  569. resp = []map[string]string{}
  570. var result *elastic.SearchResult
  571. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  572. // 1、 创建 extended_stats 高级统计
  573. aggs := elastic.NewExtendedStatsAggregation().Field("sign_in_nums")
  574. result, err = es.EsClient.Search().
  575. Index(esIndexName).
  576. TrackTotalHits(true).
  577. Query(boolQuery). // 设置查询条件
  578. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  579. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  580. Pretty(true). // 返回可读的json格式
  581. Do(context.Background())
  582. if err != nil {
  583. return resp, err
  584. }
  585. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  586. agg, found := result.Aggregations.ExtendedStats("result")
  587. if !found {
  588. // 打印结果,注意:这里使用的是取值运算符
  589. return resp, errors.New("未聚合出数据")
  590. }
  591. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  592. //2、histogram 直方图聚合
  593. stdDeviation := *agg.StdDeviation //标准平方差
  594. min := *agg.Min //最小值
  595. max := *agg.Max //最大值
  596. avg := *agg.Avg //平均数
  597. totalCount := agg.Count //总数
  598. discreteCoefficient := stdDeviation / avg //离散系数
  599. if stdDeviation < avg {
  600. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  601. discreteCoefficient = stdDeviation
  602. }
  603. newAggs := elastic.NewHistogramAggregation().Field("sign_in_nums").Interval(discreteCoefficient).ExtendedBounds(min, max)
  604. searchResult, err := es.EsClient.Search().
  605. Index(esIndexName).
  606. TrackTotalHits(true).
  607. Query(boolQuery). // 设置查询条件
  608. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  609. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  610. Pretty(true). // 返回可读的json格式
  611. Do(context.Background())
  612. if err != nil {
  613. return resp, err
  614. }
  615. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  616. newAgg, found := searchResult.Aggregations.Histogram("result")
  617. if !found {
  618. return resp, errors.New("未聚合出数据")
  619. }
  620. // 3、组装数据
  621. var keys []string
  622. var values []int64
  623. for _, bucket := range newAgg.Buckets {
  624. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  625. bucketValue := bucket.Key
  626. keys = append(keys, utils.Float64ToStr(bucketValue))
  627. values = append(values, bucket.DocCount)
  628. }
  629. for k, v := range keys {
  630. value, _ := Operate(values[k], totalCount)
  631. if k+1 == len(keys) {
  632. resp = append(resp, map[string]string{
  633. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  634. "value": utils.Float64ToStrPrec10(value),
  635. })
  636. } else {
  637. resp = append(resp, map[string]string{
  638. "key": v + " ~ " + keys[k+1] + " 元",
  639. "value": utils.Float64ToStrPrec10(value),
  640. })
  641. }
  642. }
  643. }
  644. return resp, nil
  645. }
  646. // StatisticsUserEggSendRedPackageNumsRange 统计用户"发红包次数"范围
  647. func StatisticsUserEggSendRedPackageNumsRange(esIndexName string) (resp []map[string]string, err error) {
  648. resp = []map[string]string{}
  649. var result *elastic.SearchResult
  650. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  651. // 1、 创建 extended_stats 高级统计
  652. aggs := elastic.NewExtendedStatsAggregation().Field("send_red_package_nums")
  653. result, err = es.EsClient.Search().
  654. Index(esIndexName).
  655. TrackTotalHits(true).
  656. Query(boolQuery). // 设置查询条件
  657. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  658. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  659. Pretty(true). // 返回可读的json格式
  660. Do(context.Background())
  661. if err != nil {
  662. return resp, err
  663. }
  664. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  665. agg, found := result.Aggregations.ExtendedStats("result")
  666. if !found {
  667. // 打印结果,注意:这里使用的是取值运算符
  668. return resp, errors.New("未聚合出数据")
  669. }
  670. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  671. //2、histogram 直方图聚合
  672. stdDeviation := *agg.StdDeviation //标准平方差
  673. min := *agg.Min //最小值
  674. max := *agg.Max //最大值
  675. avg := *agg.Avg //平均数
  676. totalCount := agg.Count //总数
  677. discreteCoefficient := stdDeviation / avg //离散系数
  678. if stdDeviation < avg {
  679. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  680. discreteCoefficient = stdDeviation
  681. }
  682. newAggs := elastic.NewHistogramAggregation().Field("send_red_package_nums").Interval(discreteCoefficient).ExtendedBounds(min, max)
  683. searchResult, err := es.EsClient.Search().
  684. Index(esIndexName).
  685. TrackTotalHits(true).
  686. Query(boolQuery). // 设置查询条件
  687. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  688. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  689. Pretty(true). // 返回可读的json格式
  690. Do(context.Background())
  691. if err != nil {
  692. return resp, err
  693. }
  694. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  695. newAgg, found := searchResult.Aggregations.Histogram("result")
  696. if !found {
  697. return resp, errors.New("未聚合出数据")
  698. }
  699. // 3、组装数据
  700. var keys []string
  701. var values []int64
  702. for _, bucket := range newAgg.Buckets {
  703. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  704. bucketValue := bucket.Key
  705. keys = append(keys, utils.Float64ToStr(bucketValue))
  706. values = append(values, bucket.DocCount)
  707. }
  708. for k, v := range keys {
  709. value, _ := Operate(values[k], totalCount)
  710. if k+1 == len(keys) {
  711. resp = append(resp, map[string]string{
  712. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  713. "value": utils.Float64ToStrPrec10(value),
  714. })
  715. } else {
  716. resp = append(resp, map[string]string{
  717. "key": v + " ~ " + keys[k+1] + " 元",
  718. "value": utils.Float64ToStrPrec10(value),
  719. })
  720. }
  721. }
  722. }
  723. return resp, nil
  724. }
  725. // StatisticsUserEggEggEnergyExchangeAccountBalanceRange 统计用户"蛋蛋能量兑换余额数量"范围
  726. func StatisticsUserEggEggEnergyExchangeAccountBalanceRange(esIndexName string) (resp []map[string]string, err error) {
  727. resp = []map[string]string{}
  728. var result *elastic.SearchResult
  729. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  730. // 1、 创建 extended_stats 高级统计
  731. aggs := elastic.NewExtendedStatsAggregation().Field("account_balance_exchange_egg_energy_nums")
  732. result, err = es.EsClient.Search().
  733. Index(esIndexName).
  734. TrackTotalHits(true).
  735. Query(boolQuery). // 设置查询条件
  736. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  737. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  738. Pretty(true). // 返回可读的json格式
  739. Do(context.Background())
  740. if err != nil {
  741. return resp, err
  742. }
  743. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  744. agg, found := result.Aggregations.ExtendedStats("result")
  745. if !found {
  746. // 打印结果,注意:这里使用的是取值运算符
  747. return resp, errors.New("未聚合出数据")
  748. }
  749. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  750. //2、histogram 直方图聚合
  751. stdDeviation := *agg.StdDeviation //标准平方差
  752. min := *agg.Min //最小值
  753. max := *agg.Max //最大值
  754. avg := *agg.Avg //平均数
  755. totalCount := agg.Count //总数
  756. discreteCoefficient := stdDeviation / avg //离散系数
  757. if stdDeviation < avg {
  758. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  759. discreteCoefficient = stdDeviation
  760. }
  761. newAggs := elastic.NewHistogramAggregation().Field("account_balance_exchange_egg_energy_nums").Interval(discreteCoefficient).ExtendedBounds(min, max)
  762. searchResult, err := es.EsClient.Search().
  763. Index(esIndexName).
  764. TrackTotalHits(true).
  765. Query(boolQuery). // 设置查询条件
  766. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  767. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  768. Pretty(true). // 返回可读的json格式
  769. Do(context.Background())
  770. if err != nil {
  771. return resp, err
  772. }
  773. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  774. newAgg, found := searchResult.Aggregations.Histogram("result")
  775. if !found {
  776. return resp, errors.New("未聚合出数据")
  777. }
  778. // 3、组装数据
  779. var keys []string
  780. var values []int64
  781. for _, bucket := range newAgg.Buckets {
  782. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  783. bucketValue := bucket.Key
  784. keys = append(keys, utils.Float64ToStr(bucketValue))
  785. values = append(values, bucket.DocCount)
  786. }
  787. for k, v := range keys {
  788. value, _ := Operate(values[k], totalCount)
  789. if k+1 == len(keys) {
  790. resp = append(resp, map[string]string{
  791. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  792. "value": utils.Float64ToStrPrec10(value),
  793. })
  794. } else {
  795. resp = append(resp, map[string]string{
  796. "key": v + " ~ " + keys[k+1] + " 元",
  797. "value": utils.Float64ToStrPrec10(value),
  798. })
  799. }
  800. }
  801. }
  802. return resp, nil
  803. }
  804. // StatisticsUserEggAccountBalanceExchangeEggEnergyNumsRange 统计用户"余额兑换蛋蛋能量数量"范围
  805. func StatisticsUserEggAccountBalanceExchangeEggEnergyNumsRange(esIndexName string) (resp []map[string]string, err error) {
  806. resp = []map[string]string{}
  807. var result *elastic.SearchResult
  808. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  809. // 1、 创建 extended_stats 高级统计
  810. aggs := elastic.NewExtendedStatsAggregation().Field("egg_energy_exchange_account_balance")
  811. result, err = es.EsClient.Search().
  812. Index(esIndexName).
  813. TrackTotalHits(true).
  814. Query(boolQuery). // 设置查询条件
  815. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  816. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  817. Pretty(true). // 返回可读的json格式
  818. Do(context.Background())
  819. if err != nil {
  820. return resp, err
  821. }
  822. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  823. agg, found := result.Aggregations.ExtendedStats("result")
  824. if !found {
  825. // 打印结果,注意:这里使用的是取值运算符
  826. return resp, errors.New("未聚合出数据")
  827. }
  828. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  829. //2、histogram 直方图聚合
  830. stdDeviation := *agg.StdDeviation //标准平方差
  831. min := *agg.Min //最小值
  832. max := *agg.Max //最大值
  833. avg := *agg.Avg //平均数
  834. totalCount := agg.Count //总数
  835. discreteCoefficient := stdDeviation / avg //离散系数
  836. if stdDeviation < avg {
  837. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  838. discreteCoefficient = stdDeviation
  839. }
  840. newAggs := elastic.NewHistogramAggregation().Field("egg_energy_exchange_account_balance").Interval(discreteCoefficient).ExtendedBounds(min, max)
  841. searchResult, err := es.EsClient.Search().
  842. Index(esIndexName).
  843. TrackTotalHits(true).
  844. Query(boolQuery). // 设置查询条件
  845. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  846. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  847. Pretty(true). // 返回可读的json格式
  848. Do(context.Background())
  849. if err != nil {
  850. return resp, err
  851. }
  852. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  853. newAgg, found := searchResult.Aggregations.Histogram("result")
  854. if !found {
  855. return resp, errors.New("未聚合出数据")
  856. }
  857. // 3、组装数据
  858. var keys []string
  859. var values []int64
  860. for _, bucket := range newAgg.Buckets {
  861. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  862. bucketValue := bucket.Key
  863. keys = append(keys, utils.Float64ToStr(bucketValue))
  864. values = append(values, bucket.DocCount)
  865. }
  866. for k, v := range keys {
  867. value, _ := Operate(values[k], totalCount)
  868. if k+1 == len(keys) {
  869. resp = append(resp, map[string]string{
  870. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  871. "value": utils.Float64ToStrPrec10(value),
  872. })
  873. } else {
  874. resp = append(resp, map[string]string{
  875. "key": v + " ~ " + keys[k+1] + " 元",
  876. "value": utils.Float64ToStrPrec10(value),
  877. })
  878. }
  879. }
  880. }
  881. return resp, nil
  882. }
  883. // StatisticsUserEggSendCircleOfFriendNumsRange 统计用户"发朋友圈次数"范围
  884. func StatisticsUserEggSendCircleOfFriendNumsRange(esIndexName string) (resp []map[string]string, err error) {
  885. resp = []map[string]string{}
  886. var result *elastic.SearchResult
  887. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  888. // 1、 创建 extended_stats 高级统计
  889. aggs := elastic.NewExtendedStatsAggregation().Field("send_circle_of_friend_nums")
  890. result, err = es.EsClient.Search().
  891. Index(esIndexName).
  892. TrackTotalHits(true).
  893. Query(boolQuery). // 设置查询条件
  894. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  895. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  896. Pretty(true). // 返回可读的json格式
  897. Do(context.Background())
  898. if err != nil {
  899. return resp, err
  900. }
  901. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  902. agg, found := result.Aggregations.ExtendedStats("result")
  903. if !found {
  904. // 打印结果,注意:这里使用的是取值运算符
  905. return resp, errors.New("未聚合出数据")
  906. }
  907. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  908. //2、histogram 直方图聚合
  909. stdDeviation := *agg.StdDeviation //标准平方差
  910. min := *agg.Min //最小值
  911. max := *agg.Max //最大值
  912. avg := *agg.Avg //平均数
  913. totalCount := agg.Count //总数
  914. discreteCoefficient := stdDeviation / avg //离散系数
  915. if stdDeviation < avg {
  916. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  917. discreteCoefficient = stdDeviation
  918. }
  919. newAggs := elastic.NewHistogramAggregation().Field("send_circle_of_friend_nums").Interval(discreteCoefficient).ExtendedBounds(min, max)
  920. searchResult, err := es.EsClient.Search().
  921. Index(esIndexName).
  922. TrackTotalHits(true).
  923. Query(boolQuery). // 设置查询条件
  924. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  925. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  926. Pretty(true). // 返回可读的json格式
  927. Do(context.Background())
  928. if err != nil {
  929. return resp, err
  930. }
  931. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  932. newAgg, found := searchResult.Aggregations.Histogram("result")
  933. if !found {
  934. return resp, errors.New("未聚合出数据")
  935. }
  936. // 3、组装数据
  937. var keys []string
  938. var values []int64
  939. for _, bucket := range newAgg.Buckets {
  940. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  941. bucketValue := bucket.Key
  942. keys = append(keys, utils.Float64ToStr(bucketValue))
  943. values = append(values, bucket.DocCount)
  944. }
  945. for k, v := range keys {
  946. value, _ := Operate(values[k], totalCount)
  947. if k+1 == len(keys) {
  948. resp = append(resp, map[string]string{
  949. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  950. "value": utils.Float64ToStrPrec10(value),
  951. })
  952. } else {
  953. resp = append(resp, map[string]string{
  954. "key": v + " ~ " + keys[k+1] + " 元",
  955. "value": utils.Float64ToStrPrec10(value),
  956. })
  957. }
  958. }
  959. }
  960. return resp, nil
  961. }
  962. // StatisticsUserEggForumCommentsNumsRange 统计用户"论坛评论次数"范围
  963. func StatisticsUserEggForumCommentsNumsRange(esIndexName string) (resp []map[string]string, err error) {
  964. resp = []map[string]string{}
  965. var result *elastic.SearchResult
  966. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  967. // 1、 创建 extended_stats 高级统计
  968. aggs := elastic.NewExtendedStatsAggregation().Field("forum_comments_nums")
  969. result, err = es.EsClient.Search().
  970. Index(esIndexName).
  971. TrackTotalHits(true).
  972. Query(boolQuery). // 设置查询条件
  973. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  974. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  975. Pretty(true). // 返回可读的json格式
  976. Do(context.Background())
  977. if err != nil {
  978. return resp, err
  979. }
  980. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  981. agg, found := result.Aggregations.ExtendedStats("result")
  982. if !found {
  983. // 打印结果,注意:这里使用的是取值运算符
  984. return resp, errors.New("未聚合出数据")
  985. }
  986. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  987. //2、histogram 直方图聚合
  988. stdDeviation := *agg.StdDeviation //标准平方差
  989. min := *agg.Min //最小值
  990. max := *agg.Max //最大值
  991. avg := *agg.Avg //平均数
  992. totalCount := agg.Count //总数
  993. discreteCoefficient := stdDeviation / avg //离散系数
  994. if stdDeviation < avg {
  995. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  996. discreteCoefficient = stdDeviation
  997. }
  998. newAggs := elastic.NewHistogramAggregation().Field("forum_comments_nums").Interval(discreteCoefficient).ExtendedBounds(min, max)
  999. searchResult, err := es.EsClient.Search().
  1000. Index(esIndexName).
  1001. TrackTotalHits(true).
  1002. Query(boolQuery). // 设置查询条件
  1003. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  1004. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  1005. Pretty(true). // 返回可读的json格式
  1006. Do(context.Background())
  1007. if err != nil {
  1008. return resp, err
  1009. }
  1010. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  1011. newAgg, found := searchResult.Aggregations.Histogram("result")
  1012. if !found {
  1013. return resp, errors.New("未聚合出数据")
  1014. }
  1015. // 3、组装数据
  1016. var keys []string
  1017. var values []int64
  1018. for _, bucket := range newAgg.Buckets {
  1019. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  1020. bucketValue := bucket.Key
  1021. keys = append(keys, utils.Float64ToStr(bucketValue))
  1022. values = append(values, bucket.DocCount)
  1023. }
  1024. for k, v := range keys {
  1025. value, _ := Operate(values[k], totalCount)
  1026. if k+1 == len(keys) {
  1027. resp = append(resp, map[string]string{
  1028. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  1029. "value": utils.Float64ToStrPrec10(value),
  1030. })
  1031. } else {
  1032. resp = append(resp, map[string]string{
  1033. "key": v + " ~ " + keys[k+1] + " 元",
  1034. "value": utils.Float64ToStrPrec10(value),
  1035. })
  1036. }
  1037. }
  1038. }
  1039. return resp, nil
  1040. }
  1041. // StatisticsUserEggCollegeLearningNumsRange 统计用户"学院学习次数"范围
  1042. func StatisticsUserEggCollegeLearningNumsRange(esIndexName string) (resp []map[string]string, err error) {
  1043. resp = []map[string]string{}
  1044. var result *elastic.SearchResult
  1045. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  1046. // 1、 创建 extended_stats 高级统计
  1047. aggs := elastic.NewExtendedStatsAggregation().Field("college_learning_nums")
  1048. result, err = es.EsClient.Search().
  1049. Index(esIndexName).
  1050. TrackTotalHits(true).
  1051. Query(boolQuery). // 设置查询条件
  1052. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  1053. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  1054. Pretty(true). // 返回可读的json格式
  1055. Do(context.Background())
  1056. if err != nil {
  1057. return resp, err
  1058. }
  1059. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  1060. agg, found := result.Aggregations.ExtendedStats("result")
  1061. if !found {
  1062. // 打印结果,注意:这里使用的是取值运算符
  1063. return resp, errors.New("未聚合出数据")
  1064. }
  1065. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  1066. //2、histogram 直方图聚合
  1067. stdDeviation := *agg.StdDeviation //标准平方差
  1068. min := *agg.Min //最小值
  1069. max := *agg.Max //最大值
  1070. avg := *agg.Avg //平均数
  1071. totalCount := agg.Count //总数
  1072. discreteCoefficient := stdDeviation / avg //离散系数
  1073. if stdDeviation < avg {
  1074. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  1075. discreteCoefficient = stdDeviation
  1076. }
  1077. newAggs := elastic.NewHistogramAggregation().Field("college_learning_nums").Interval(discreteCoefficient).ExtendedBounds(min, max)
  1078. searchResult, err := es.EsClient.Search().
  1079. Index(esIndexName).
  1080. TrackTotalHits(true).
  1081. Query(boolQuery). // 设置查询条件
  1082. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  1083. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  1084. Pretty(true). // 返回可读的json格式
  1085. Do(context.Background())
  1086. if err != nil {
  1087. return resp, err
  1088. }
  1089. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  1090. newAgg, found := searchResult.Aggregations.Histogram("result")
  1091. if !found {
  1092. return resp, errors.New("未聚合出数据")
  1093. }
  1094. // 3、组装数据
  1095. var keys []string
  1096. var values []int64
  1097. for _, bucket := range newAgg.Buckets {
  1098. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  1099. bucketValue := bucket.Key
  1100. keys = append(keys, utils.Float64ToStr(bucketValue))
  1101. values = append(values, bucket.DocCount)
  1102. }
  1103. for k, v := range keys {
  1104. value, _ := Operate(values[k], totalCount)
  1105. if k+1 == len(keys) {
  1106. resp = append(resp, map[string]string{
  1107. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  1108. "value": utils.Float64ToStrPrec10(value),
  1109. })
  1110. } else {
  1111. resp = append(resp, map[string]string{
  1112. "key": v + " ~ " + keys[k+1] + " 元",
  1113. "value": utils.Float64ToStrPrec10(value),
  1114. })
  1115. }
  1116. }
  1117. }
  1118. return resp, nil
  1119. }
  1120. // StatisticsUserEggViolateNumsRange 统计用户"违规次数"范围
  1121. func StatisticsUserEggViolateNumsRange(esIndexName string) (resp []map[string]string, err error) {
  1122. resp = []map[string]string{}
  1123. var result *elastic.SearchResult
  1124. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  1125. // 1、 创建 extended_stats 高级统计
  1126. aggs := elastic.NewExtendedStatsAggregation().Field("violate_nums")
  1127. result, err = es.EsClient.Search().
  1128. Index(esIndexName).
  1129. TrackTotalHits(true).
  1130. Query(boolQuery). // 设置查询条件
  1131. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  1132. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  1133. Pretty(true). // 返回可读的json格式
  1134. Do(context.Background())
  1135. if err != nil {
  1136. return resp, err
  1137. }
  1138. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  1139. agg, found := result.Aggregations.ExtendedStats("result")
  1140. if !found {
  1141. // 打印结果,注意:这里使用的是取值运算符
  1142. return resp, errors.New("未聚合出数据")
  1143. }
  1144. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  1145. //2、histogram 直方图聚合
  1146. stdDeviation := *agg.StdDeviation //标准平方差
  1147. min := *agg.Min //最小值
  1148. max := *agg.Max //最大值
  1149. avg := *agg.Avg //平均数
  1150. totalCount := agg.Count //总数
  1151. discreteCoefficient := stdDeviation / avg //离散系数
  1152. if stdDeviation < avg {
  1153. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  1154. discreteCoefficient = stdDeviation
  1155. }
  1156. newAggs := elastic.NewHistogramAggregation().Field("violate_nums").Interval(discreteCoefficient).ExtendedBounds(min, max)
  1157. searchResult, err := es.EsClient.Search().
  1158. Index(esIndexName).
  1159. TrackTotalHits(true).
  1160. Query(boolQuery). // 设置查询条件
  1161. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  1162. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  1163. Pretty(true). // 返回可读的json格式
  1164. Do(context.Background())
  1165. if err != nil {
  1166. return resp, err
  1167. }
  1168. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  1169. newAgg, found := searchResult.Aggregations.Histogram("result")
  1170. if !found {
  1171. return resp, errors.New("未聚合出数据")
  1172. }
  1173. // 3、组装数据
  1174. var keys []string
  1175. var values []int64
  1176. for _, bucket := range newAgg.Buckets {
  1177. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  1178. bucketValue := bucket.Key
  1179. keys = append(keys, utils.Float64ToStr(bucketValue))
  1180. values = append(values, bucket.DocCount)
  1181. }
  1182. for k, v := range keys {
  1183. value, _ := Operate(values[k], totalCount)
  1184. if k+1 == len(keys) {
  1185. resp = append(resp, map[string]string{
  1186. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  1187. "value": utils.Float64ToStrPrec10(value),
  1188. })
  1189. } else {
  1190. resp = append(resp, map[string]string{
  1191. "key": v + " ~ " + keys[k+1] + " 元",
  1192. "value": utils.Float64ToStrPrec10(value),
  1193. })
  1194. }
  1195. }
  1196. }
  1197. return resp, nil
  1198. }
  1199. // StatisticsUserEggBrowseInterfaceNumsRange 统计用户"浏览界面次数"范围
  1200. func StatisticsUserEggBrowseInterfaceNumsRange(esIndexName string) (resp []map[string]string, err error) {
  1201. resp = []map[string]string{}
  1202. var result *elastic.SearchResult
  1203. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  1204. // 1、 创建 extended_stats 高级统计
  1205. aggs := elastic.NewExtendedStatsAggregation().Field("browse_interface_nums")
  1206. result, err = es.EsClient.Search().
  1207. Index(esIndexName).
  1208. TrackTotalHits(true).
  1209. Query(boolQuery). // 设置查询条件
  1210. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  1211. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  1212. Pretty(true). // 返回可读的json格式
  1213. Do(context.Background())
  1214. if err != nil {
  1215. return resp, err
  1216. }
  1217. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  1218. agg, found := result.Aggregations.ExtendedStats("result")
  1219. if !found {
  1220. // 打印结果,注意:这里使用的是取值运算符
  1221. return resp, errors.New("未聚合出数据")
  1222. }
  1223. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  1224. //2、histogram 直方图聚合
  1225. stdDeviation := *agg.StdDeviation //标准平方差
  1226. min := *agg.Min //最小值
  1227. max := *agg.Max //最大值
  1228. avg := *agg.Avg //平均数
  1229. totalCount := agg.Count //总数
  1230. discreteCoefficient := stdDeviation / avg //离散系数
  1231. if stdDeviation < avg {
  1232. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  1233. discreteCoefficient = stdDeviation
  1234. }
  1235. newAggs := elastic.NewHistogramAggregation().Field("browse_interface_nums").Interval(discreteCoefficient).ExtendedBounds(min, max)
  1236. searchResult, err := es.EsClient.Search().
  1237. Index(esIndexName).
  1238. TrackTotalHits(true).
  1239. Query(boolQuery). // 设置查询条件
  1240. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  1241. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  1242. Pretty(true). // 返回可读的json格式
  1243. Do(context.Background())
  1244. if err != nil {
  1245. return resp, err
  1246. }
  1247. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  1248. newAgg, found := searchResult.Aggregations.Histogram("result")
  1249. if !found {
  1250. return resp, errors.New("未聚合出数据")
  1251. }
  1252. // 3、组装数据
  1253. var keys []string
  1254. var values []int64
  1255. for _, bucket := range newAgg.Buckets {
  1256. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  1257. bucketValue := bucket.Key
  1258. keys = append(keys, utils.Float64ToStr(bucketValue))
  1259. values = append(values, bucket.DocCount)
  1260. }
  1261. for k, v := range keys {
  1262. value, _ := Operate(values[k], totalCount)
  1263. if k+1 == len(keys) {
  1264. resp = append(resp, map[string]string{
  1265. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  1266. "value": utils.Float64ToStrPrec10(value),
  1267. })
  1268. } else {
  1269. resp = append(resp, map[string]string{
  1270. "key": v + " ~ " + keys[k+1] + " 元",
  1271. "value": utils.Float64ToStrPrec10(value),
  1272. })
  1273. }
  1274. }
  1275. }
  1276. return resp, nil
  1277. }
  1278. // StatisticsUserEggPersonAddActivityValueRange 统计用户"个人活跃积分增量值"范围
  1279. func StatisticsUserEggPersonAddActivityValueRange(esIndexName string) (resp []map[string]string, err error) {
  1280. resp = []map[string]string{}
  1281. var result *elastic.SearchResult
  1282. boolQuery := elastic.NewBoolQuery().Must() // 创建bool查询
  1283. // 1、 创建 extended_stats 高级统计
  1284. aggs := elastic.NewExtendedStatsAggregation().Field("person_add_activity_value")
  1285. result, err = es.EsClient.Search().
  1286. Index(esIndexName).
  1287. TrackTotalHits(true).
  1288. Query(boolQuery). // 设置查询条件
  1289. Aggregation("result", aggs). // 设置聚合条件,并为聚合条件设置一个名字
  1290. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  1291. Pretty(true). // 返回可读的json格式
  1292. Do(context.Background())
  1293. if err != nil {
  1294. return resp, err
  1295. }
  1296. // 使用Cardinality函数和前面定义的聚合条件名称,查询结果
  1297. agg, found := result.Aggregations.ExtendedStats("result")
  1298. if !found {
  1299. // 打印结果,注意:这里使用的是取值运算符
  1300. return resp, errors.New("未聚合出数据")
  1301. }
  1302. if agg.StdDeviation != nil && *agg.StdDeviation != 0 {
  1303. //2、histogram 直方图聚合
  1304. stdDeviation := *agg.StdDeviation //标准平方差
  1305. min := *agg.Min //最小值
  1306. max := *agg.Max //最大值
  1307. avg := *agg.Avg //平均数
  1308. totalCount := agg.Count //总数
  1309. discreteCoefficient := stdDeviation / avg //离散系数
  1310. if stdDeviation < avg {
  1311. //TODO::如果标准差相对较小,而平均值较大,离散系数可能会导致较大的间隔,直接使用标准差或其他更合适的值作为间隔。
  1312. discreteCoefficient = stdDeviation
  1313. }
  1314. newAggs := elastic.NewHistogramAggregation().Field("person_add_activity_value").Interval(discreteCoefficient).ExtendedBounds(min, max)
  1315. searchResult, err := es.EsClient.Search().
  1316. Index(esIndexName).
  1317. TrackTotalHits(true).
  1318. Query(boolQuery). // 设置查询条件
  1319. Aggregation("result", newAggs). // 设置聚合条件,并为聚合条件设置一个名字
  1320. Size(0). // 设置分页参数 - 每页大小,设置为0,代表不返回搜索结果,仅返回聚合分析结果
  1321. Pretty(true). // 返回可读的json格式
  1322. Do(context.Background())
  1323. if err != nil {
  1324. return resp, err
  1325. }
  1326. // 使用Terms函数和前面定义的聚合条件名称,查询结果
  1327. newAgg, found := searchResult.Aggregations.Histogram("result")
  1328. if !found {
  1329. return resp, errors.New("未聚合出数据")
  1330. }
  1331. // 3、组装数据
  1332. var keys []string
  1333. var values []int64
  1334. for _, bucket := range newAgg.Buckets {
  1335. // 每一个桶都有一个key值,其实就是分组的值,可以理解为SQL的group by值
  1336. bucketValue := bucket.Key
  1337. keys = append(keys, utils.Float64ToStr(bucketValue))
  1338. values = append(values, bucket.DocCount)
  1339. }
  1340. for k, v := range keys {
  1341. value, _ := Operate(values[k], totalCount)
  1342. if k+1 == len(keys) {
  1343. resp = append(resp, map[string]string{
  1344. "key": v + " ~ " + utils.Float64ToStr(max) + " 元",
  1345. "value": utils.Float64ToStrPrec10(value),
  1346. })
  1347. } else {
  1348. resp = append(resp, map[string]string{
  1349. "key": v + " ~ " + keys[k+1] + " 元",
  1350. "value": utils.Float64ToStrPrec10(value),
  1351. })
  1352. }
  1353. }
  1354. }
  1355. return resp, nil
  1356. }
  1357. func GetYearsAndWeeks() (resp map[string][]string, err error) {
  1358. // 1、 获取到所有的索引
  1359. indices, err := es.GetIndexFromAlias(md.EggEnergyUserEggScoreEsAlias)
  1360. if err != nil {
  1361. return nil, err
  1362. }
  1363. //2、组装数据
  1364. resp = map[string][]string{}
  1365. for _, index := range indices {
  1366. // 分割字符串
  1367. parts := strings.Split(index, "_")
  1368. // 提取 2024 和 46
  1369. resp[parts[len(parts)-1][:4]] = append(resp[parts[len(parts)-1][:4]], parts[len(parts)-1][4:])
  1370. }
  1371. return
  1372. }
  1373. func GetYearsAndWeekStr(esIndexName string) (string, string) {
  1374. parts := strings.Split(esIndexName, "_")
  1375. return parts[len(parts)-1][:4], parts[len(parts)-1][4:]
  1376. }
  1377. // Operate 除运算保留10位小数
  1378. func Operate(num1, num2 int64) (float64, error) {
  1379. value, err := strconv.ParseFloat(fmt.Sprintf("%.10f", float64(num1)/float64(num2)), 64)
  1380. if err != nil {
  1381. return 0, err
  1382. }
  1383. return value, nil
  1384. }