search_facets_terms_stats.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. // The terms_stats facet combines both the terms and statistical allowing
  6. // to compute stats computed on a field, per term value driven
  7. // by another field.
  8. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-facets-terms-stats-facet.html
  9. type TermsStatsFacet struct {
  10. facetFilter Filter
  11. global *bool
  12. nested string
  13. mode string
  14. keyField string
  15. valueField string
  16. size int
  17. shardSize int
  18. comparatorType string
  19. script string
  20. lang string
  21. params map[string]interface{}
  22. }
  23. func NewTermsStatsFacet() TermsStatsFacet {
  24. return TermsStatsFacet{
  25. size: -1,
  26. shardSize: -1,
  27. params: make(map[string]interface{}),
  28. }
  29. }
  30. func (f TermsStatsFacet) FacetFilter(filter Facet) TermsStatsFacet {
  31. f.facetFilter = filter
  32. return f
  33. }
  34. func (f TermsStatsFacet) Global(global bool) TermsStatsFacet {
  35. f.global = &global
  36. return f
  37. }
  38. func (f TermsStatsFacet) Nested(nested string) TermsStatsFacet {
  39. f.nested = nested
  40. return f
  41. }
  42. func (f TermsStatsFacet) Mode(mode string) TermsStatsFacet {
  43. f.mode = mode
  44. return f
  45. }
  46. func (f TermsStatsFacet) KeyField(keyField string) TermsStatsFacet {
  47. f.keyField = keyField
  48. return f
  49. }
  50. func (f TermsStatsFacet) ValueField(valueField string) TermsStatsFacet {
  51. f.valueField = valueField
  52. return f
  53. }
  54. func (f TermsStatsFacet) Order(comparatorType string) TermsStatsFacet {
  55. f.comparatorType = comparatorType
  56. return f
  57. }
  58. func (f TermsStatsFacet) Size(size int) TermsStatsFacet {
  59. f.size = size
  60. return f
  61. }
  62. func (f TermsStatsFacet) ShardSize(shardSize int) TermsStatsFacet {
  63. f.shardSize = shardSize
  64. return f
  65. }
  66. func (f TermsStatsFacet) AllTerms() TermsStatsFacet {
  67. f.size = 0
  68. return f
  69. }
  70. func (f TermsStatsFacet) ValueScript(script string) TermsStatsFacet {
  71. f.script = script
  72. return f
  73. }
  74. func (f TermsStatsFacet) Param(name string, value interface{}) TermsStatsFacet {
  75. f.params[name] = value
  76. return f
  77. }
  78. func (f TermsStatsFacet) addFilterFacetAndGlobal(source map[string]interface{}) {
  79. if f.facetFilter != nil {
  80. source["facet_filter"] = f.facetFilter.Source()
  81. }
  82. if f.nested != "" {
  83. source["nested"] = f.nested
  84. }
  85. if f.global != nil {
  86. source["global"] = *f.global
  87. }
  88. if f.mode != "" {
  89. source["mode"] = f.mode
  90. }
  91. }
  92. func (f TermsStatsFacet) Source() interface{} {
  93. source := make(map[string]interface{})
  94. f.addFilterFacetAndGlobal(source)
  95. opts := make(map[string]interface{})
  96. source["terms_stats"] = opts
  97. opts["key_field"] = f.keyField
  98. if f.valueField != "" {
  99. opts["value_field"] = f.valueField
  100. }
  101. if f.script != "" {
  102. opts["value_script"] = f.script
  103. if f.lang != "" {
  104. opts["lang"] = f.lang
  105. }
  106. if len(f.params) > 0 {
  107. opts["params"] = f.params
  108. }
  109. }
  110. if f.comparatorType != "" {
  111. opts["order"] = f.comparatorType
  112. }
  113. if f.size != -1 {
  114. opts["size"] = f.size
  115. }
  116. if f.shardSize > f.size {
  117. opts["shard_size"] = f.shardSize
  118. }
  119. return source
  120. }