search_queries_query_string.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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. "fmt"
  7. )
  8. // A query that uses the query parser in order to parse
  9. // its content. For more details, see
  10. // http://www.elasticsearch.org/guide/reference/query-dsl/query-string-query.html
  11. type QueryStringQuery struct {
  12. Query
  13. queryString string
  14. defaultField string
  15. defaultOper string
  16. analyzer string
  17. quoteAnalyzer string
  18. quoteFieldSuffix string
  19. autoGeneratePhraseQueries *bool
  20. allowLeadingWildcard *bool
  21. lowercaseExpandedTerms *bool
  22. enablePositionIncrements *bool
  23. analyzeWildcard *bool
  24. boost *float32
  25. fuzzyMinSim *float32
  26. fuzzyPrefixLength *int
  27. fuzzyMaxExpansions *int
  28. fuzzyRewrite string
  29. phraseSlop *int
  30. fields []string
  31. fieldBoosts map[string]*float32
  32. useDisMax *bool
  33. tieBreaker *float32
  34. rewrite string
  35. minimumShouldMatch string
  36. lenient *bool
  37. }
  38. // Creates a new query string query.
  39. func NewQueryStringQuery(queryString string) QueryStringQuery {
  40. q := QueryStringQuery{
  41. queryString: queryString,
  42. fields: make([]string, 0),
  43. fieldBoosts: make(map[string]*float32),
  44. }
  45. return q
  46. }
  47. func (q QueryStringQuery) DefaultField(defaultField string) QueryStringQuery {
  48. q.defaultField = defaultField
  49. return q
  50. }
  51. func (q QueryStringQuery) Field(field string) QueryStringQuery {
  52. q.fields = append(q.fields, field)
  53. return q
  54. }
  55. func (q QueryStringQuery) FieldWithBoost(field string, boost float32) QueryStringQuery {
  56. q.fields = append(q.fields, field)
  57. q.fieldBoosts[field] = &boost
  58. return q
  59. }
  60. func (q QueryStringQuery) UseDisMax(useDisMax bool) QueryStringQuery {
  61. q.useDisMax = &useDisMax
  62. return q
  63. }
  64. func (q QueryStringQuery) TieBreaker(tieBreaker float32) QueryStringQuery {
  65. q.tieBreaker = &tieBreaker
  66. return q
  67. }
  68. func (q QueryStringQuery) DefaultOperator(operator string) QueryStringQuery {
  69. q.defaultOper = operator
  70. return q
  71. }
  72. func (q QueryStringQuery) Analyzer(analyzer string) QueryStringQuery {
  73. q.analyzer = analyzer
  74. return q
  75. }
  76. func (q QueryStringQuery) QuoteAnalyzer(quoteAnalyzer string) QueryStringQuery {
  77. q.quoteAnalyzer = quoteAnalyzer
  78. return q
  79. }
  80. func (q QueryStringQuery) AutoGeneratePhraseQueries(autoGeneratePhraseQueries bool) QueryStringQuery {
  81. q.autoGeneratePhraseQueries = &autoGeneratePhraseQueries
  82. return q
  83. }
  84. func (q QueryStringQuery) AllowLeadingWildcard(allowLeadingWildcard bool) QueryStringQuery {
  85. q.allowLeadingWildcard = &allowLeadingWildcard
  86. return q
  87. }
  88. func (q QueryStringQuery) LowercaseExpandedTerms(lowercaseExpandedTerms bool) QueryStringQuery {
  89. q.lowercaseExpandedTerms = &lowercaseExpandedTerms
  90. return q
  91. }
  92. func (q QueryStringQuery) EnablePositionIncrements(enablePositionIncrements bool) QueryStringQuery {
  93. q.enablePositionIncrements = &enablePositionIncrements
  94. return q
  95. }
  96. func (q QueryStringQuery) FuzzyMinSim(fuzzyMinSim float32) QueryStringQuery {
  97. q.fuzzyMinSim = &fuzzyMinSim
  98. return q
  99. }
  100. func (q QueryStringQuery) FuzzyMaxExpansions(fuzzyMaxExpansions int) QueryStringQuery {
  101. q.fuzzyMaxExpansions = &fuzzyMaxExpansions
  102. return q
  103. }
  104. func (q QueryStringQuery) FuzzyRewrite(fuzzyRewrite string) QueryStringQuery {
  105. q.fuzzyRewrite = fuzzyRewrite
  106. return q
  107. }
  108. func (q QueryStringQuery) PhraseSlop(phraseSlop int) QueryStringQuery {
  109. q.phraseSlop = &phraseSlop
  110. return q
  111. }
  112. func (q QueryStringQuery) AnalyzeWildcard(analyzeWildcard bool) QueryStringQuery {
  113. q.analyzeWildcard = &analyzeWildcard
  114. return q
  115. }
  116. func (q QueryStringQuery) Rewrite(rewrite string) QueryStringQuery {
  117. q.rewrite = rewrite
  118. return q
  119. }
  120. func (q QueryStringQuery) MinimumShouldMatch(minimumShouldMatch string) QueryStringQuery {
  121. q.minimumShouldMatch = minimumShouldMatch
  122. return q
  123. }
  124. func (q QueryStringQuery) Boost(boost float32) QueryStringQuery {
  125. q.boost = &boost
  126. return q
  127. }
  128. func (q QueryStringQuery) QuoteFieldSuffix(quoteFieldSuffix string) QueryStringQuery {
  129. q.quoteFieldSuffix = quoteFieldSuffix
  130. return q
  131. }
  132. func (q QueryStringQuery) Lenient(lenient bool) QueryStringQuery {
  133. q.lenient = &lenient
  134. return q
  135. }
  136. // Creates the query source for the query string query.
  137. func (q QueryStringQuery) Source() interface{} {
  138. // {
  139. // "query_string" : {
  140. // "default_field" : "content",
  141. // "query" : "this AND that OR thus"
  142. // }
  143. // }
  144. source := make(map[string]interface{})
  145. query := make(map[string]interface{})
  146. source["query_string"] = query
  147. query["query"] = q.queryString
  148. if q.defaultField != "" {
  149. query["default_field"] = q.defaultField
  150. }
  151. if len(q.fields) > 0 {
  152. fields := make([]string, 0)
  153. for _, field := range q.fields {
  154. if boost, found := q.fieldBoosts[field]; found {
  155. if boost != nil {
  156. fields = append(fields, fmt.Sprintf("%s^%f", field, *boost))
  157. } else {
  158. fields = append(fields, field)
  159. }
  160. } else {
  161. fields = append(fields, field)
  162. }
  163. }
  164. query["fields"] = fields
  165. }
  166. if q.tieBreaker != nil {
  167. query["tie_breaker"] = *q.tieBreaker
  168. }
  169. if q.useDisMax != nil {
  170. query["use_dis_max"] = *q.useDisMax
  171. }
  172. if q.defaultOper != "" {
  173. query["default_operator"] = q.defaultOper
  174. }
  175. if q.analyzer != "" {
  176. query["analyzer"] = q.analyzer
  177. }
  178. if q.quoteAnalyzer != "" {
  179. query["quote_analyzer"] = q.quoteAnalyzer
  180. }
  181. if q.autoGeneratePhraseQueries != nil {
  182. query["auto_generate_phrase_queries"] = *q.autoGeneratePhraseQueries
  183. }
  184. if q.allowLeadingWildcard != nil {
  185. query["allow_leading_wildcard"] = *q.allowLeadingWildcard
  186. }
  187. if q.lowercaseExpandedTerms != nil {
  188. query["lowercase_expanded_terms"] = *q.lowercaseExpandedTerms
  189. }
  190. if q.enablePositionIncrements != nil {
  191. query["enable_position_increments"] = *q.enablePositionIncrements
  192. }
  193. if q.fuzzyMinSim != nil {
  194. query["fuzzy_min_sim"] = *q.fuzzyMinSim
  195. }
  196. if q.boost != nil {
  197. query["boost"] = *q.boost
  198. }
  199. if q.fuzzyPrefixLength != nil {
  200. query["fuzzy_prefix_length"] = *q.fuzzyPrefixLength
  201. }
  202. if q.fuzzyMaxExpansions != nil {
  203. query["fuzzy_max_expansions"] = *q.fuzzyMaxExpansions
  204. }
  205. if q.fuzzyRewrite != "" {
  206. query["fuzzy_rewrite"] = q.fuzzyRewrite
  207. }
  208. if q.phraseSlop != nil {
  209. query["phrase_slop"] = *q.phraseSlop
  210. }
  211. if q.analyzeWildcard != nil {
  212. query["analyze_wildcard"] = *q.analyzeWildcard
  213. }
  214. if q.rewrite != "" {
  215. query["rewrite"] = q.rewrite
  216. }
  217. if q.minimumShouldMatch != "" {
  218. query["minimum_should_match"] = q.minimumShouldMatch
  219. }
  220. if q.quoteFieldSuffix != "" {
  221. query["quote_field_suffix"] = q.quoteFieldSuffix
  222. }
  223. if q.lenient != nil {
  224. query["lenient"] = *q.lenient
  225. }
  226. return source
  227. }