search_facets_terms.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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. // Allow to specify field facets that return the N most frequent terms.
  6. // See: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-facets-terms-facet.html
  7. type TermsFacet struct {
  8. facetFilter Filter
  9. global *bool
  10. nested string
  11. mode string
  12. fieldName string
  13. fields []string
  14. size int
  15. shardSize *int
  16. allTerms *bool
  17. exclude []string
  18. regex string
  19. regexFlags string
  20. comparatorType string
  21. script string
  22. lang string
  23. params map[string]interface{}
  24. executionHint string
  25. index string
  26. }
  27. func NewTermsFacet() TermsFacet {
  28. f := TermsFacet{
  29. size: 10,
  30. fields: make([]string, 0),
  31. exclude: make([]string, 0),
  32. params: make(map[string]interface{}),
  33. }
  34. return f
  35. }
  36. func (f TermsFacet) FacetFilter(filter Facet) TermsFacet {
  37. f.facetFilter = filter
  38. return f
  39. }
  40. func (f TermsFacet) Global(global bool) TermsFacet {
  41. f.global = &global
  42. return f
  43. }
  44. func (f TermsFacet) Nested(nested string) TermsFacet {
  45. f.nested = nested
  46. return f
  47. }
  48. func (f TermsFacet) Mode(mode string) TermsFacet {
  49. f.mode = mode
  50. return f
  51. }
  52. func (f TermsFacet) Field(fieldName string) TermsFacet {
  53. f.fieldName = fieldName
  54. return f
  55. }
  56. func (f TermsFacet) Fields(fields ...string) TermsFacet {
  57. f.fields = append(f.fields, fields...)
  58. return f
  59. }
  60. func (f TermsFacet) ScriptField(scriptField string) TermsFacet {
  61. f.script = scriptField
  62. return f
  63. }
  64. func (f TermsFacet) Exclude(exclude ...string) TermsFacet {
  65. f.exclude = append(f.exclude, exclude...)
  66. return f
  67. }
  68. func (f TermsFacet) Size(size int) TermsFacet {
  69. f.size = size
  70. return f
  71. }
  72. func (f TermsFacet) ShardSize(shardSize int) TermsFacet {
  73. f.shardSize = &shardSize
  74. return f
  75. }
  76. func (f TermsFacet) Regex(regex string) TermsFacet {
  77. f.regex = regex
  78. return f
  79. }
  80. func (f TermsFacet) RegexFlags(regexFlags string) TermsFacet {
  81. f.regexFlags = regexFlags
  82. return f
  83. }
  84. func (f TermsFacet) Order(order string) TermsFacet {
  85. f.comparatorType = order
  86. return f
  87. }
  88. func (f TermsFacet) Comparator(comparatorType string) TermsFacet {
  89. f.comparatorType = comparatorType
  90. return f
  91. }
  92. func (f TermsFacet) Script(script string) TermsFacet {
  93. f.script = script
  94. return f
  95. }
  96. func (f TermsFacet) Lang(lang string) TermsFacet {
  97. f.lang = lang
  98. return f
  99. }
  100. func (f TermsFacet) ExecutionHint(hint string) TermsFacet {
  101. f.executionHint = hint
  102. return f
  103. }
  104. func (f TermsFacet) Param(name string, value interface{}) TermsFacet {
  105. f.params[name] = value
  106. return f
  107. }
  108. func (f TermsFacet) AllTerms(allTerms bool) TermsFacet {
  109. f.allTerms = &allTerms
  110. return f
  111. }
  112. func (f TermsFacet) Index(index string) TermsFacet {
  113. f.index = index
  114. return f
  115. }
  116. func (f TermsFacet) addFilterFacetAndGlobal(source map[string]interface{}) {
  117. if f.facetFilter != nil {
  118. source["facet_filter"] = f.facetFilter.Source()
  119. }
  120. if f.nested != "" {
  121. source["nested"] = f.nested
  122. }
  123. if f.global != nil {
  124. source["global"] = *f.global
  125. }
  126. if f.mode != "" {
  127. source["mode"] = f.mode
  128. }
  129. }
  130. func (f TermsFacet) Source() interface{} {
  131. source := make(map[string]interface{})
  132. f.addFilterFacetAndGlobal(source)
  133. opts := make(map[string]interface{})
  134. source["terms"] = opts
  135. if len(f.fields) > 0 {
  136. if len(f.fields) == 1 {
  137. opts["field"] = f.fields[0]
  138. } else {
  139. opts["fields"] = f.fields
  140. }
  141. } else {
  142. opts["field"] = f.fieldName
  143. }
  144. opts["size"] = f.size
  145. if f.shardSize != nil && *f.shardSize > f.size {
  146. opts["shard_size"] = *f.shardSize
  147. }
  148. if len(f.exclude) > 0 {
  149. opts["exclude"] = f.exclude
  150. }
  151. if f.regex != "" {
  152. opts["regex"] = f.regex
  153. if f.regexFlags != "" {
  154. opts["regex_flags"] = f.regexFlags
  155. }
  156. }
  157. if f.comparatorType != "" {
  158. opts["order"] = f.comparatorType
  159. }
  160. if f.allTerms != nil {
  161. opts["all_terms"] = *f.allTerms
  162. }
  163. if f.script != "" {
  164. opts["script"] = f.script
  165. if f.lang != "" {
  166. opts["lang"] = f.lang
  167. }
  168. if len(f.params) > 0 {
  169. opts["params"] = f.params
  170. }
  171. }
  172. if f.executionHint != "" {
  173. opts["execution_hint"] = f.executionHint
  174. }
  175. return source
  176. }