蛋蛋星球 后台端
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.

svc_egg_energy.go 55 KiB

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