search_aggs.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  1. // Copyright 2012-2015 Oliver Eilhard. All rights reserved.
  2. // Use of this source code is governed by a MIT-license.
  3. // See http://olivere.mit-license.org/license.txt for details.
  4. package elastic
  5. import (
  6. "bytes"
  7. "encoding/json"
  8. )
  9. // Aggregations can be seen as a unit-of-work that build
  10. // analytic information over a set of documents. It is
  11. // (in many senses) the follow-up of facets in Elasticsearch.
  12. // For more details about aggregations, visit:
  13. // http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations.html
  14. type Aggregation interface {
  15. Source() interface{}
  16. }
  17. // Aggregations is a list of aggregations that are part of a search result.
  18. type Aggregations map[string]*json.RawMessage
  19. // Min returns min aggregation results.
  20. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-min-aggregation.html
  21. func (a Aggregations) Min(name string) (*AggregationValueMetric, bool) {
  22. if raw, found := a[name]; found {
  23. agg := new(AggregationValueMetric)
  24. if raw == nil {
  25. return agg, true
  26. }
  27. if err := json.Unmarshal(*raw, agg); err == nil {
  28. return agg, true
  29. }
  30. }
  31. return nil, false
  32. }
  33. // Max returns max aggregation results.
  34. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-max-aggregation.html
  35. func (a Aggregations) Max(name string) (*AggregationValueMetric, bool) {
  36. if raw, found := a[name]; found {
  37. agg := new(AggregationValueMetric)
  38. if raw == nil {
  39. return agg, true
  40. }
  41. if err := json.Unmarshal(*raw, agg); err == nil {
  42. return agg, true
  43. }
  44. }
  45. return nil, false
  46. }
  47. // Sum returns sum aggregation results.
  48. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-sum-aggregation.html
  49. func (a Aggregations) Sum(name string) (*AggregationValueMetric, bool) {
  50. if raw, found := a[name]; found {
  51. agg := new(AggregationValueMetric)
  52. if raw == nil {
  53. return agg, true
  54. }
  55. if err := json.Unmarshal(*raw, agg); err == nil {
  56. return agg, true
  57. }
  58. }
  59. return nil, false
  60. }
  61. // Avg returns average aggregation results.
  62. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-avg-aggregation.html
  63. func (a Aggregations) Avg(name string) (*AggregationValueMetric, bool) {
  64. if raw, found := a[name]; found {
  65. agg := new(AggregationValueMetric)
  66. if raw == nil {
  67. return agg, true
  68. }
  69. if err := json.Unmarshal(*raw, agg); err == nil {
  70. return agg, true
  71. }
  72. }
  73. return nil, false
  74. }
  75. // ValueCount returns value-count aggregation results.
  76. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-valuecount-aggregation.html
  77. func (a Aggregations) ValueCount(name string) (*AggregationValueMetric, bool) {
  78. if raw, found := a[name]; found {
  79. agg := new(AggregationValueMetric)
  80. if raw == nil {
  81. return agg, true
  82. }
  83. if err := json.Unmarshal(*raw, agg); err == nil {
  84. return agg, true
  85. }
  86. }
  87. return nil, false
  88. }
  89. // Cardinality returns cardinality aggregation results.
  90. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html
  91. func (a Aggregations) Cardinality(name string) (*AggregationValueMetric, bool) {
  92. if raw, found := a[name]; found {
  93. agg := new(AggregationValueMetric)
  94. if raw == nil {
  95. return agg, true
  96. }
  97. if err := json.Unmarshal(*raw, agg); err == nil {
  98. return agg, true
  99. }
  100. }
  101. return nil, false
  102. }
  103. // Stats returns stats aggregation results.
  104. // http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-stats-aggregation.html
  105. func (a Aggregations) Stats(name string) (*AggregationStatsMetric, bool) {
  106. if raw, found := a[name]; found {
  107. agg := new(AggregationStatsMetric)
  108. if raw == nil {
  109. return agg, true
  110. }
  111. if err := json.Unmarshal(*raw, agg); err == nil {
  112. return agg, true
  113. }
  114. }
  115. return nil, false
  116. }
  117. // ExtendedStats returns extended stats aggregation results.
  118. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-extendedstats-aggregation.html
  119. func (a Aggregations) ExtendedStats(name string) (*AggregationExtendedStatsMetric, bool) {
  120. if raw, found := a[name]; found {
  121. agg := new(AggregationExtendedStatsMetric)
  122. if raw == nil {
  123. return agg, true
  124. }
  125. if err := json.Unmarshal(*raw, agg); err == nil {
  126. return agg, true
  127. }
  128. }
  129. return nil, false
  130. }
  131. // Percentiles returns percentiles results.
  132. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-percentile-aggregation.html
  133. func (a Aggregations) Percentiles(name string) (*AggregationPercentilesMetric, bool) {
  134. if raw, found := a[name]; found {
  135. agg := new(AggregationPercentilesMetric)
  136. if raw == nil {
  137. return agg, true
  138. }
  139. if err := json.Unmarshal(*raw, agg); err == nil {
  140. return agg, true
  141. }
  142. }
  143. return nil, false
  144. }
  145. // PercentileRanks returns percentile ranks results.
  146. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-percentile-rank-aggregation.html
  147. func (a Aggregations) PercentileRanks(name string) (*AggregationPercentilesMetric, bool) {
  148. if raw, found := a[name]; found {
  149. agg := new(AggregationPercentilesMetric)
  150. if raw == nil {
  151. return agg, true
  152. }
  153. if err := json.Unmarshal(*raw, agg); err == nil {
  154. return agg, true
  155. }
  156. }
  157. return nil, false
  158. }
  159. // TopHits returns top-hits aggregation results.
  160. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html
  161. func (a Aggregations) TopHits(name string) (*AggregationTopHitsMetric, bool) {
  162. if raw, found := a[name]; found {
  163. agg := new(AggregationTopHitsMetric)
  164. if raw == nil {
  165. return agg, true
  166. }
  167. if err := json.Unmarshal(*raw, agg); err == nil {
  168. return agg, true
  169. }
  170. }
  171. return nil, false
  172. }
  173. // Global returns global results.
  174. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-global-aggregation.html
  175. func (a Aggregations) Global(name string) (*AggregationSingleBucket, bool) {
  176. if raw, found := a[name]; found {
  177. agg := new(AggregationSingleBucket)
  178. if raw == nil {
  179. return agg, true
  180. }
  181. if err := json.Unmarshal(*raw, agg); err == nil {
  182. return agg, true
  183. }
  184. }
  185. return nil, false
  186. }
  187. // Filter returns filter results.
  188. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html
  189. func (a Aggregations) Filter(name string) (*AggregationSingleBucket, bool) {
  190. if raw, found := a[name]; found {
  191. agg := new(AggregationSingleBucket)
  192. if raw == nil {
  193. return agg, true
  194. }
  195. if err := json.Unmarshal(*raw, agg); err == nil {
  196. return agg, true
  197. }
  198. }
  199. return nil, false
  200. }
  201. // Filters returns filters results.
  202. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filters-aggregation.html
  203. func (a Aggregations) Filters(name string) (*AggregationBucketFilters, bool) {
  204. if raw, found := a[name]; found {
  205. agg := new(AggregationBucketFilters)
  206. if raw == nil {
  207. return agg, true
  208. }
  209. if err := json.Unmarshal(*raw, agg); err == nil {
  210. return agg, true
  211. }
  212. }
  213. return nil, false
  214. }
  215. // Missing returns missing results.
  216. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-missing-aggregation.html
  217. func (a Aggregations) Missing(name string) (*AggregationSingleBucket, bool) {
  218. if raw, found := a[name]; found {
  219. agg := new(AggregationSingleBucket)
  220. if raw == nil {
  221. return agg, true
  222. }
  223. if err := json.Unmarshal(*raw, agg); err == nil {
  224. return agg, true
  225. }
  226. }
  227. return nil, false
  228. }
  229. // Nested returns nested results.
  230. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-nested-aggregation.html
  231. func (a Aggregations) Nested(name string) (*AggregationSingleBucket, bool) {
  232. if raw, found := a[name]; found {
  233. agg := new(AggregationSingleBucket)
  234. if raw == nil {
  235. return agg, true
  236. }
  237. if err := json.Unmarshal(*raw, agg); err == nil {
  238. return agg, true
  239. }
  240. }
  241. return nil, false
  242. }
  243. // ReverseNested returns reverse-nested results.
  244. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-reverse-nested-aggregation.html
  245. func (a Aggregations) ReverseNested(name string) (*AggregationSingleBucket, bool) {
  246. if raw, found := a[name]; found {
  247. agg := new(AggregationSingleBucket)
  248. if raw == nil {
  249. return agg, true
  250. }
  251. if err := json.Unmarshal(*raw, agg); err == nil {
  252. return agg, true
  253. }
  254. }
  255. return nil, false
  256. }
  257. // Children returns children results.
  258. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-children-aggregation.html
  259. func (a Aggregations) Children(name string) (*AggregationSingleBucket, bool) {
  260. if raw, found := a[name]; found {
  261. agg := new(AggregationSingleBucket)
  262. if raw == nil {
  263. return agg, true
  264. }
  265. if err := json.Unmarshal(*raw, agg); err == nil {
  266. return agg, true
  267. }
  268. }
  269. return nil, false
  270. }
  271. // Terms returns terms aggregation results.
  272. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html
  273. func (a Aggregations) Terms(name string) (*AggregationBucketKeyItems, bool) {
  274. if raw, found := a[name]; found {
  275. agg := new(AggregationBucketKeyItems)
  276. if raw == nil {
  277. return agg, true
  278. }
  279. if err := json.Unmarshal(*raw, agg); err == nil {
  280. return agg, true
  281. }
  282. }
  283. return nil, false
  284. }
  285. // SignificantTerms returns significant terms aggregation results.
  286. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-significantterms-aggregation.html
  287. func (a Aggregations) SignificantTerms(name string) (*AggregationBucketSignificantTerms, bool) {
  288. if raw, found := a[name]; found {
  289. agg := new(AggregationBucketSignificantTerms)
  290. if raw == nil {
  291. return agg, true
  292. }
  293. if err := json.Unmarshal(*raw, agg); err == nil {
  294. return agg, true
  295. }
  296. }
  297. return nil, false
  298. }
  299. // Range returns range aggregation results.
  300. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-range-aggregation.html
  301. func (a Aggregations) Range(name string) (*AggregationBucketRangeItems, bool) {
  302. if raw, found := a[name]; found {
  303. agg := new(AggregationBucketRangeItems)
  304. if raw == nil {
  305. return agg, true
  306. }
  307. if err := json.Unmarshal(*raw, agg); err == nil {
  308. return agg, true
  309. }
  310. }
  311. return nil, false
  312. }
  313. // DateRange returns date range aggregation results.
  314. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-daterange-aggregation.html
  315. func (a Aggregations) DateRange(name string) (*AggregationBucketRangeItems, bool) {
  316. if raw, found := a[name]; found {
  317. agg := new(AggregationBucketRangeItems)
  318. if raw == nil {
  319. return agg, true
  320. }
  321. if err := json.Unmarshal(*raw, agg); err == nil {
  322. return agg, true
  323. }
  324. }
  325. return nil, false
  326. }
  327. // IPv4Range returns IPv4 range aggregation results.
  328. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-iprange-aggregation.html
  329. func (a Aggregations) IPv4Range(name string) (*AggregationBucketRangeItems, bool) {
  330. if raw, found := a[name]; found {
  331. agg := new(AggregationBucketRangeItems)
  332. if raw == nil {
  333. return agg, true
  334. }
  335. if err := json.Unmarshal(*raw, agg); err == nil {
  336. return agg, true
  337. }
  338. }
  339. return nil, false
  340. }
  341. // Histogram returns histogram aggregation results.
  342. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-histogram-aggregation.html
  343. func (a Aggregations) Histogram(name string) (*AggregationBucketHistogramItems, bool) {
  344. if raw, found := a[name]; found {
  345. agg := new(AggregationBucketHistogramItems)
  346. if raw == nil {
  347. return agg, true
  348. }
  349. if err := json.Unmarshal(*raw, agg); err == nil {
  350. return agg, true
  351. }
  352. }
  353. return nil, false
  354. }
  355. // DateHistogram returns date histogram aggregation results.
  356. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-datehistogram-aggregation.html
  357. func (a Aggregations) DateHistogram(name string) (*AggregationBucketHistogramItems, bool) {
  358. if raw, found := a[name]; found {
  359. agg := new(AggregationBucketHistogramItems)
  360. if raw == nil {
  361. return agg, true
  362. }
  363. if err := json.Unmarshal(*raw, agg); err == nil {
  364. return agg, true
  365. }
  366. }
  367. return nil, false
  368. }
  369. // GeoBounds returns geo-bounds aggregation results.
  370. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-geobounds-aggregation.html
  371. func (a Aggregations) GeoBounds(name string) (*AggregationGeoBoundsMetric, bool) {
  372. if raw, found := a[name]; found {
  373. agg := new(AggregationGeoBoundsMetric)
  374. if raw == nil {
  375. return agg, true
  376. }
  377. if err := json.Unmarshal(*raw, agg); err == nil {
  378. return agg, true
  379. }
  380. }
  381. return nil, false
  382. }
  383. // GeoHash returns geo-hash aggregation results.
  384. // http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-geohashgrid-aggregation.html
  385. func (a Aggregations) GeoHash(name string) (*AggregationBucketKeyItems, bool) {
  386. if raw, found := a[name]; found {
  387. agg := new(AggregationBucketKeyItems)
  388. if raw == nil {
  389. return agg, true
  390. }
  391. if err := json.Unmarshal(*raw, agg); err == nil {
  392. return agg, true
  393. }
  394. }
  395. return nil, false
  396. }
  397. // GeoDistance returns geo distance aggregation results.
  398. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-geodistance-aggregation.html
  399. func (a Aggregations) GeoDistance(name string) (*AggregationBucketRangeItems, bool) {
  400. if raw, found := a[name]; found {
  401. agg := new(AggregationBucketRangeItems)
  402. if raw == nil {
  403. return agg, true
  404. }
  405. if err := json.Unmarshal(*raw, agg); err == nil {
  406. return agg, true
  407. }
  408. }
  409. return nil, false
  410. }
  411. // -- Single value metric --
  412. // AggregationValueMetric is a single-value metric, returned e.g. by a
  413. // Min or Max aggregation.
  414. type AggregationValueMetric struct {
  415. Aggregations
  416. Value *float64 //`json:"value"`
  417. }
  418. // UnmarshalJSON decodes JSON data and initializes an AggregationValueMetric structure.
  419. func (a *AggregationValueMetric) UnmarshalJSON(data []byte) error {
  420. var aggs map[string]*json.RawMessage
  421. if err := json.Unmarshal(data, &aggs); err != nil {
  422. return err
  423. }
  424. if v, ok := aggs["value"]; ok && v != nil {
  425. json.Unmarshal(*v, &a.Value)
  426. }
  427. a.Aggregations = aggs
  428. return nil
  429. }
  430. // -- Stats metric --
  431. // AggregationStatsMetric is a multi-value metric, returned by a Stats aggregation.
  432. type AggregationStatsMetric struct {
  433. Aggregations
  434. Count int64 // `json:"count"`
  435. Min *float64 //`json:"min,omitempty"`
  436. Max *float64 //`json:"max,omitempty"`
  437. Avg *float64 //`json:"avg,omitempty"`
  438. Sum *float64 //`json:"sum,omitempty"`
  439. }
  440. // UnmarshalJSON decodes JSON data and initializes an AggregationStatsMetric structure.
  441. func (a *AggregationStatsMetric) UnmarshalJSON(data []byte) error {
  442. var aggs map[string]*json.RawMessage
  443. if err := json.Unmarshal(data, &aggs); err != nil {
  444. return err
  445. }
  446. if v, ok := aggs["count"]; ok && v != nil {
  447. json.Unmarshal(*v, &a.Count)
  448. }
  449. if v, ok := aggs["min"]; ok && v != nil {
  450. json.Unmarshal(*v, &a.Min)
  451. }
  452. if v, ok := aggs["max"]; ok && v != nil {
  453. json.Unmarshal(*v, &a.Max)
  454. }
  455. if v, ok := aggs["avg"]; ok && v != nil {
  456. json.Unmarshal(*v, &a.Avg)
  457. }
  458. if v, ok := aggs["sum"]; ok && v != nil {
  459. json.Unmarshal(*v, &a.Sum)
  460. }
  461. a.Aggregations = aggs
  462. return nil
  463. }
  464. // -- Extended stats metric --
  465. // AggregationExtendedStatsMetric is a multi-value metric, returned by an ExtendedStats aggregation.
  466. type AggregationExtendedStatsMetric struct {
  467. Aggregations
  468. Count int64 // `json:"count"`
  469. Min *float64 //`json:"min,omitempty"`
  470. Max *float64 //`json:"max,omitempty"`
  471. Avg *float64 //`json:"avg,omitempty"`
  472. Sum *float64 //`json:"sum,omitempty"`
  473. SumOfSquares *float64 //`json:"sum_of_squares,omitempty"`
  474. Variance *float64 //`json:"variance,omitempty"`
  475. StdDeviation *float64 //`json:"std_deviation,omitempty"`
  476. }
  477. // UnmarshalJSON decodes JSON data and initializes an AggregationExtendedStatsMetric structure.
  478. func (a *AggregationExtendedStatsMetric) UnmarshalJSON(data []byte) error {
  479. var aggs map[string]*json.RawMessage
  480. if err := json.Unmarshal(data, &aggs); err != nil {
  481. return err
  482. }
  483. if v, ok := aggs["count"]; ok && v != nil {
  484. json.Unmarshal(*v, &a.Count)
  485. }
  486. if v, ok := aggs["min"]; ok && v != nil {
  487. json.Unmarshal(*v, &a.Min)
  488. }
  489. if v, ok := aggs["max"]; ok && v != nil {
  490. json.Unmarshal(*v, &a.Max)
  491. }
  492. if v, ok := aggs["avg"]; ok && v != nil {
  493. json.Unmarshal(*v, &a.Avg)
  494. }
  495. if v, ok := aggs["sum"]; ok && v != nil {
  496. json.Unmarshal(*v, &a.Sum)
  497. }
  498. if v, ok := aggs["sum_of_squares"]; ok && v != nil {
  499. json.Unmarshal(*v, &a.SumOfSquares)
  500. }
  501. if v, ok := aggs["variance"]; ok && v != nil {
  502. json.Unmarshal(*v, &a.Variance)
  503. }
  504. if v, ok := aggs["std_deviation"]; ok && v != nil {
  505. json.Unmarshal(*v, &a.StdDeviation)
  506. }
  507. a.Aggregations = aggs
  508. return nil
  509. }
  510. // -- Percentiles metric --
  511. // AggregationPercentilesMetric is a multi-value metric, returned by a Percentiles aggregation.
  512. type AggregationPercentilesMetric struct {
  513. Aggregations
  514. Values map[string]float64 // `json:"values"`
  515. }
  516. // UnmarshalJSON decodes JSON data and initializes an AggregationPercentilesMetric structure.
  517. func (a *AggregationPercentilesMetric) UnmarshalJSON(data []byte) error {
  518. var aggs map[string]*json.RawMessage
  519. if err := json.Unmarshal(data, &aggs); err != nil {
  520. return err
  521. }
  522. if v, ok := aggs["values"]; ok && v != nil {
  523. json.Unmarshal(*v, &a.Values)
  524. }
  525. a.Aggregations = aggs
  526. return nil
  527. }
  528. // -- Top-hits metric --
  529. // AggregationTopHitsMetric is a metric returned by a TopHits aggregation.
  530. type AggregationTopHitsMetric struct {
  531. Aggregations
  532. Hits *SearchHits //`json:"hits"`
  533. }
  534. // UnmarshalJSON decodes JSON data and initializes an AggregationTopHitsMetric structure.
  535. func (a *AggregationTopHitsMetric) UnmarshalJSON(data []byte) error {
  536. var aggs map[string]*json.RawMessage
  537. if err := json.Unmarshal(data, &aggs); err != nil {
  538. return err
  539. }
  540. a.Aggregations = aggs
  541. a.Hits = new(SearchHits)
  542. if v, ok := aggs["hits"]; ok && v != nil {
  543. json.Unmarshal(*v, &a.Hits)
  544. }
  545. return nil
  546. }
  547. // -- Geo-bounds metric --
  548. // AggregationGeoBoundsMetric is a metric as returned by a GeoBounds aggregation.
  549. type AggregationGeoBoundsMetric struct {
  550. Aggregations
  551. Bounds struct {
  552. TopLeft struct {
  553. Latitude float64 `json:"lat"`
  554. Longitude float64 `json:"lon"`
  555. } `json:"top_left"`
  556. BottomRight struct {
  557. Latitude float64 `json:"lat"`
  558. Longitude float64 `json:"lon"`
  559. } `json:"bottom_right"`
  560. } `json:"bounds"`
  561. }
  562. // UnmarshalJSON decodes JSON data and initializes an AggregationGeoBoundsMetric structure.
  563. func (a *AggregationGeoBoundsMetric) UnmarshalJSON(data []byte) error {
  564. var aggs map[string]*json.RawMessage
  565. if err := json.Unmarshal(data, &aggs); err != nil {
  566. return err
  567. }
  568. if v, ok := aggs["bounds"]; ok && v != nil {
  569. json.Unmarshal(*v, &a.Bounds)
  570. }
  571. a.Aggregations = aggs
  572. return nil
  573. }
  574. // -- Single bucket --
  575. // AggregationSingleBucket is a single bucket, returned e.g. via an aggregation of type Global.
  576. type AggregationSingleBucket struct {
  577. Aggregations
  578. DocCount int64 // `json:"doc_count"`
  579. }
  580. // UnmarshalJSON decodes JSON data and initializes an AggregationSingleBucket structure.
  581. func (a *AggregationSingleBucket) UnmarshalJSON(data []byte) error {
  582. var aggs map[string]*json.RawMessage
  583. if err := json.Unmarshal(data, &aggs); err != nil {
  584. return err
  585. }
  586. if v, ok := aggs["doc_count"]; ok && v != nil {
  587. json.Unmarshal(*v, &a.DocCount)
  588. }
  589. a.Aggregations = aggs
  590. return nil
  591. }
  592. // -- Bucket range items --
  593. // AggregationBucketRangeItems is a bucket aggregation that is e.g. returned
  594. // with a range aggregation.
  595. type AggregationBucketRangeItems struct {
  596. Aggregations
  597. DocCountErrorUpperBound int64 //`json:"doc_count_error_upper_bound"`
  598. SumOfOtherDocCount int64 //`json:"sum_other_doc_count"`
  599. Buckets []*AggregationBucketRangeItem //`json:"buckets"`
  600. }
  601. // UnmarshalJSON decodes JSON data and initializes an AggregationBucketRangeItems structure.
  602. func (a *AggregationBucketRangeItems) UnmarshalJSON(data []byte) error {
  603. var aggs map[string]*json.RawMessage
  604. if err := json.Unmarshal(data, &aggs); err != nil {
  605. return err
  606. }
  607. if v, ok := aggs["doc_count_error_upper_bound"]; ok && v != nil {
  608. json.Unmarshal(*v, &a.DocCountErrorUpperBound)
  609. }
  610. if v, ok := aggs["sum_other_doc_count"]; ok && v != nil {
  611. json.Unmarshal(*v, &a.SumOfOtherDocCount)
  612. }
  613. if v, ok := aggs["buckets"]; ok && v != nil {
  614. json.Unmarshal(*v, &a.Buckets)
  615. }
  616. a.Aggregations = aggs
  617. return nil
  618. }
  619. // AggregationBucketRangeItem is a single bucket of an AggregationBucketRangeItems structure.
  620. type AggregationBucketRangeItem struct {
  621. Aggregations
  622. Key string //`json:"key"`
  623. DocCount int64 //`json:"doc_count"`
  624. From *float64 //`json:"from"`
  625. FromAsString string //`json:"from_as_string"`
  626. To *float64 //`json:"to"`
  627. ToAsString string //`json:"to_as_string"`
  628. }
  629. // UnmarshalJSON decodes JSON data and initializes an AggregationBucketRangeItem structure.
  630. func (a *AggregationBucketRangeItem) UnmarshalJSON(data []byte) error {
  631. var aggs map[string]*json.RawMessage
  632. if err := json.Unmarshal(data, &aggs); err != nil {
  633. return err
  634. }
  635. if v, ok := aggs["key"]; ok && v != nil {
  636. json.Unmarshal(*v, &a.Key)
  637. }
  638. if v, ok := aggs["doc_count"]; ok && v != nil {
  639. json.Unmarshal(*v, &a.DocCount)
  640. }
  641. if v, ok := aggs["from"]; ok && v != nil {
  642. json.Unmarshal(*v, &a.From)
  643. }
  644. if v, ok := aggs["from_as_string"]; ok && v != nil {
  645. json.Unmarshal(*v, &a.FromAsString)
  646. }
  647. if v, ok := aggs["to"]; ok && v != nil {
  648. json.Unmarshal(*v, &a.To)
  649. }
  650. if v, ok := aggs["to_as_string"]; ok && v != nil {
  651. json.Unmarshal(*v, &a.ToAsString)
  652. }
  653. a.Aggregations = aggs
  654. return nil
  655. }
  656. // -- Bucket key items --
  657. // AggregationBucketKeyItems is a bucket aggregation that is e.g. returned
  658. // with a terms aggregation.
  659. type AggregationBucketKeyItems struct {
  660. Aggregations
  661. DocCountErrorUpperBound int64 //`json:"doc_count_error_upper_bound"`
  662. SumOfOtherDocCount int64 //`json:"sum_other_doc_count"`
  663. Buckets []*AggregationBucketKeyItem //`json:"buckets"`
  664. }
  665. // UnmarshalJSON decodes JSON data and initializes an AggregationBucketKeyItems structure.
  666. func (a *AggregationBucketKeyItems) UnmarshalJSON(data []byte) error {
  667. var aggs map[string]*json.RawMessage
  668. if err := json.Unmarshal(data, &aggs); err != nil {
  669. return err
  670. }
  671. if v, ok := aggs["doc_count_error_upper_bound"]; ok && v != nil {
  672. json.Unmarshal(*v, &a.DocCountErrorUpperBound)
  673. }
  674. if v, ok := aggs["sum_other_doc_count"]; ok && v != nil {
  675. json.Unmarshal(*v, &a.SumOfOtherDocCount)
  676. }
  677. if v, ok := aggs["buckets"]; ok && v != nil {
  678. json.Unmarshal(*v, &a.Buckets)
  679. }
  680. a.Aggregations = aggs
  681. return nil
  682. }
  683. // AggregationBucketKeyItem is a single bucket of an AggregationBucketKeyItems structure.
  684. type AggregationBucketKeyItem struct {
  685. Aggregations
  686. Key interface{} //`json:"key"`
  687. KeyNumber json.Number
  688. DocCount int64 //`json:"doc_count"`
  689. }
  690. // UnmarshalJSON decodes JSON data and initializes an AggregationBucketKeyItem structure.
  691. func (a *AggregationBucketKeyItem) UnmarshalJSON(data []byte) error {
  692. var aggs map[string]*json.RawMessage
  693. dec := json.NewDecoder(bytes.NewReader(data))
  694. dec.UseNumber()
  695. if err := dec.Decode(&aggs); err != nil {
  696. return err
  697. }
  698. if v, ok := aggs["key"]; ok && v != nil {
  699. json.Unmarshal(*v, &a.Key)
  700. json.Unmarshal(*v, &a.KeyNumber)
  701. }
  702. if v, ok := aggs["doc_count"]; ok && v != nil {
  703. json.Unmarshal(*v, &a.DocCount)
  704. }
  705. a.Aggregations = aggs
  706. return nil
  707. }
  708. // -- Bucket types for significant terms --
  709. // AggregationBucketSignificantTerms is a bucket aggregation returned
  710. // with a significant terms aggregation.
  711. type AggregationBucketSignificantTerms struct {
  712. Aggregations
  713. DocCount int64 //`json:"doc_count"`
  714. Buckets []*AggregationBucketSignificantTerm //`json:"buckets"`
  715. }
  716. // UnmarshalJSON decodes JSON data and initializes an AggregationBucketSignificantTerms structure.
  717. func (a *AggregationBucketSignificantTerms) UnmarshalJSON(data []byte) error {
  718. var aggs map[string]*json.RawMessage
  719. if err := json.Unmarshal(data, &aggs); err != nil {
  720. return err
  721. }
  722. if v, ok := aggs["doc_count"]; ok && v != nil {
  723. json.Unmarshal(*v, &a.DocCount)
  724. }
  725. if v, ok := aggs["buckets"]; ok && v != nil {
  726. json.Unmarshal(*v, &a.Buckets)
  727. }
  728. a.Aggregations = aggs
  729. return nil
  730. }
  731. // AggregationBucketSignificantTerm is a single bucket of an AggregationBucketSignificantTerms structure.
  732. type AggregationBucketSignificantTerm struct {
  733. Aggregations
  734. Key string //`json:"key"`
  735. DocCount int64 //`json:"doc_count"`
  736. BgCount int64 //`json:"bg_count"`
  737. Score float64 //`json:"score"`
  738. }
  739. // UnmarshalJSON decodes JSON data and initializes an AggregationBucketSignificantTerm structure.
  740. func (a *AggregationBucketSignificantTerm) UnmarshalJSON(data []byte) error {
  741. var aggs map[string]*json.RawMessage
  742. if err := json.Unmarshal(data, &aggs); err != nil {
  743. return err
  744. }
  745. if v, ok := aggs["key"]; ok && v != nil {
  746. json.Unmarshal(*v, &a.Key)
  747. }
  748. if v, ok := aggs["doc_count"]; ok && v != nil {
  749. json.Unmarshal(*v, &a.DocCount)
  750. }
  751. if v, ok := aggs["bg_count"]; ok && v != nil {
  752. json.Unmarshal(*v, &a.BgCount)
  753. }
  754. if v, ok := aggs["score"]; ok && v != nil {
  755. json.Unmarshal(*v, &a.Score)
  756. }
  757. a.Aggregations = aggs
  758. return nil
  759. }
  760. // -- Bucket filters --
  761. // AggregationBucketFilters is a multi-bucket aggregation that is returned
  762. // with a filters aggregation.
  763. type AggregationBucketFilters struct {
  764. Aggregations
  765. Buckets []*AggregationBucketKeyItem //`json:"buckets"`
  766. NamedBuckets map[string]*AggregationBucketKeyItem //`json:"buckets"`
  767. }
  768. // UnmarshalJSON decodes JSON data and initializes an AggregationBucketFilters structure.
  769. func (a *AggregationBucketFilters) UnmarshalJSON(data []byte) error {
  770. var aggs map[string]*json.RawMessage
  771. if err := json.Unmarshal(data, &aggs); err != nil {
  772. return err
  773. }
  774. if v, ok := aggs["buckets"]; ok && v != nil {
  775. json.Unmarshal(*v, &a.Buckets)
  776. json.Unmarshal(*v, &a.NamedBuckets)
  777. }
  778. a.Aggregations = aggs
  779. return nil
  780. }
  781. // -- Bucket histogram items --
  782. // AggregationBucketHistogramItems is a bucket aggregation that is returned
  783. // with a date histogram aggregation.
  784. type AggregationBucketHistogramItems struct {
  785. Aggregations
  786. Buckets []*AggregationBucketHistogramItem //`json:"buckets"`
  787. }
  788. // UnmarshalJSON decodes JSON data and initializes an AggregationBucketHistogramItems structure.
  789. func (a *AggregationBucketHistogramItems) UnmarshalJSON(data []byte) error {
  790. var aggs map[string]*json.RawMessage
  791. if err := json.Unmarshal(data, &aggs); err != nil {
  792. return err
  793. }
  794. if v, ok := aggs["buckets"]; ok && v != nil {
  795. json.Unmarshal(*v, &a.Buckets)
  796. }
  797. a.Aggregations = aggs
  798. return nil
  799. }
  800. // AggregationBucketHistogramItem is a single bucket of an AggregationBucketHistogramItems structure.
  801. type AggregationBucketHistogramItem struct {
  802. Aggregations
  803. Key int64 //`json:"key"`
  804. KeyAsString *string //`json:"key_as_string"`
  805. DocCount int64 //`json:"doc_count"`
  806. }
  807. // UnmarshalJSON decodes JSON data and initializes an AggregationBucketHistogramItem structure.
  808. func (a *AggregationBucketHistogramItem) UnmarshalJSON(data []byte) error {
  809. var aggs map[string]*json.RawMessage
  810. if err := json.Unmarshal(data, &aggs); err != nil {
  811. return err
  812. }
  813. if v, ok := aggs["key"]; ok && v != nil {
  814. json.Unmarshal(*v, &a.Key)
  815. }
  816. if v, ok := aggs["key_as_string"]; ok && v != nil {
  817. json.Unmarshal(*v, &a.KeyAsString)
  818. }
  819. if v, ok := aggs["doc_count"]; ok && v != nil {
  820. json.Unmarshal(*v, &a.DocCount)
  821. }
  822. a.Aggregations = aggs
  823. return nil
  824. }