search_queries_simple_query_string.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Copyright 2012-present 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. "strings"
  8. )
  9. // SimpleQueryStringQuery is a query that uses the SimpleQueryParser
  10. // to parse its context. Unlike the regular query_string query,
  11. // the simple_query_string query will never throw an exception,
  12. // and discards invalid parts of the query.
  13. //
  14. // For more details, see
  15. // https://www.elastic.co/guide/en/elasticsearch/reference/5.2/query-dsl-simple-query-string-query.html
  16. type SimpleQueryStringQuery struct {
  17. queryText string
  18. analyzer string
  19. operator string
  20. fields []string
  21. fieldBoosts map[string]*float64
  22. minimumShouldMatch string
  23. flags string
  24. boost *float64
  25. lowercaseExpandedTerms *bool
  26. lenient *bool
  27. analyzeWildcard *bool
  28. locale string
  29. queryName string
  30. }
  31. // NewSimpleQueryStringQuery creates and initializes a new SimpleQueryStringQuery.
  32. func NewSimpleQueryStringQuery(text string) *SimpleQueryStringQuery {
  33. return &SimpleQueryStringQuery{
  34. queryText: text,
  35. fields: make([]string, 0),
  36. fieldBoosts: make(map[string]*float64),
  37. }
  38. }
  39. // Field adds a field to run the query against.
  40. func (q *SimpleQueryStringQuery) Field(field string) *SimpleQueryStringQuery {
  41. q.fields = append(q.fields, field)
  42. return q
  43. }
  44. // Field adds a field to run the query against with a specific boost.
  45. func (q *SimpleQueryStringQuery) FieldWithBoost(field string, boost float64) *SimpleQueryStringQuery {
  46. q.fields = append(q.fields, field)
  47. q.fieldBoosts[field] = &boost
  48. return q
  49. }
  50. // Boost sets the boost for this query.
  51. func (q *SimpleQueryStringQuery) Boost(boost float64) *SimpleQueryStringQuery {
  52. q.boost = &boost
  53. return q
  54. }
  55. // QueryName sets the query name for the filter that can be used when
  56. // searching for matched_filters per hit.
  57. func (q *SimpleQueryStringQuery) QueryName(queryName string) *SimpleQueryStringQuery {
  58. q.queryName = queryName
  59. return q
  60. }
  61. // Analyzer specifies the analyzer to use for the query.
  62. func (q *SimpleQueryStringQuery) Analyzer(analyzer string) *SimpleQueryStringQuery {
  63. q.analyzer = analyzer
  64. return q
  65. }
  66. // DefaultOperator specifies the default operator for the query.
  67. func (q *SimpleQueryStringQuery) DefaultOperator(defaultOperator string) *SimpleQueryStringQuery {
  68. q.operator = defaultOperator
  69. return q
  70. }
  71. // Flags sets the flags for the query.
  72. func (q *SimpleQueryStringQuery) Flags(flags string) *SimpleQueryStringQuery {
  73. q.flags = flags
  74. return q
  75. }
  76. // LowercaseExpandedTerms indicates whether terms of wildcard, prefix, fuzzy
  77. // and range queries are automatically lower-cased or not. Default is true.
  78. func (q *SimpleQueryStringQuery) LowercaseExpandedTerms(lowercaseExpandedTerms bool) *SimpleQueryStringQuery {
  79. q.lowercaseExpandedTerms = &lowercaseExpandedTerms
  80. return q
  81. }
  82. func (q *SimpleQueryStringQuery) Locale(locale string) *SimpleQueryStringQuery {
  83. q.locale = locale
  84. return q
  85. }
  86. // Lenient indicates whether the query string parser should be lenient
  87. // when parsing field values. It defaults to the index setting and if not
  88. // set, defaults to false.
  89. func (q *SimpleQueryStringQuery) Lenient(lenient bool) *SimpleQueryStringQuery {
  90. q.lenient = &lenient
  91. return q
  92. }
  93. // AnalyzeWildcard indicates whether to enabled analysis on wildcard and prefix queries.
  94. func (q *SimpleQueryStringQuery) AnalyzeWildcard(analyzeWildcard bool) *SimpleQueryStringQuery {
  95. q.analyzeWildcard = &analyzeWildcard
  96. return q
  97. }
  98. func (q *SimpleQueryStringQuery) MinimumShouldMatch(minimumShouldMatch string) *SimpleQueryStringQuery {
  99. q.minimumShouldMatch = minimumShouldMatch
  100. return q
  101. }
  102. // Source returns JSON for the query.
  103. func (q *SimpleQueryStringQuery) Source() (interface{}, error) {
  104. // {
  105. // "simple_query_string" : {
  106. // "query" : "\"fried eggs\" +(eggplant | potato) -frittata",
  107. // "analyzer" : "snowball",
  108. // "fields" : ["body^5","_all"],
  109. // "default_operator" : "and"
  110. // }
  111. // }
  112. source := make(map[string]interface{})
  113. query := make(map[string]interface{})
  114. source["simple_query_string"] = query
  115. query["query"] = q.queryText
  116. if len(q.fields) > 0 {
  117. var fields []string
  118. for _, field := range q.fields {
  119. if boost, found := q.fieldBoosts[field]; found {
  120. if boost != nil {
  121. fields = append(fields, fmt.Sprintf("%s^%f", field, *boost))
  122. } else {
  123. fields = append(fields, field)
  124. }
  125. } else {
  126. fields = append(fields, field)
  127. }
  128. }
  129. query["fields"] = fields
  130. }
  131. if q.flags != "" {
  132. query["flags"] = q.flags
  133. }
  134. if q.analyzer != "" {
  135. query["analyzer"] = q.analyzer
  136. }
  137. if q.operator != "" {
  138. query["default_operator"] = strings.ToLower(q.operator)
  139. }
  140. if q.lowercaseExpandedTerms != nil {
  141. query["lowercase_expanded_terms"] = *q.lowercaseExpandedTerms
  142. }
  143. if q.lenient != nil {
  144. query["lenient"] = *q.lenient
  145. }
  146. if q.analyzeWildcard != nil {
  147. query["analyze_wildcard"] = *q.analyzeWildcard
  148. }
  149. if q.locale != "" {
  150. query["locale"] = q.locale
  151. }
  152. if q.queryName != "" {
  153. query["_name"] = q.queryName
  154. }
  155. if q.minimumShouldMatch != "" {
  156. query["minimum_should_match"] = q.minimumShouldMatch
  157. }
  158. if q.boost != nil {
  159. query["boost"] = *q.boost
  160. }
  161. return source, nil
  162. }