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 5package elastic 6 7import ( 8 "fmt" 9 "strings" 10) 11 12// SimpleQueryStringQuery is a query that uses the SimpleQueryParser 13// to parse its context. Unlike the regular query_string query, 14// the simple_query_string query will never throw an exception, 15// and discards invalid parts of the query. 16// For more details, see 17// http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html 18type SimpleQueryStringQuery struct { 19 queryText string 20 analyzer string 21 operator string 22 fields []string 23 fieldBoosts map[string]*float32 24} 25 26// Creates a new simple query string query. 27func NewSimpleQueryStringQuery(text string) SimpleQueryStringQuery { 28 q := SimpleQueryStringQuery{ 29 queryText: text, 30 fields: make([]string, 0), 31 fieldBoosts: make(map[string]*float32), 32 } 33 return q 34} 35 36func (q SimpleQueryStringQuery) Field(field string) SimpleQueryStringQuery { 37 q.fields = append(q.fields, field) 38 return q 39} 40 41func (q SimpleQueryStringQuery) FieldWithBoost(field string, boost float32) SimpleQueryStringQuery { 42 q.fields = append(q.fields, field) 43 q.fieldBoosts[field] = &boost 44 return q 45} 46 47func (q SimpleQueryStringQuery) Analyzer(analyzer string) SimpleQueryStringQuery { 48 q.analyzer = analyzer 49 return q 50} 51 52func (q SimpleQueryStringQuery) DefaultOperator(defaultOperator string) SimpleQueryStringQuery { 53 q.operator = defaultOperator 54 return q 55} 56 57// Creates the query source for the query string query. 58func (q SimpleQueryStringQuery) Source() interface{} { 59 // { 60 // "simple_query_string" : { 61 // "query" : "\"fried eggs\" +(eggplant | potato) -frittata", 62 // "analyzer" : "snowball", 63 // "fields" : ["body^5","_all"], 64 // "default_operator" : "and" 65 // } 66 // } 67 68 source := make(map[string]interface{}) 69 70 query := make(map[string]interface{}) 71 source["simple_query_string"] = query 72 73 query["query"] = q.queryText 74 75 if len(q.fields) > 0 { 76 fields := make([]string, 0) 77 for _, field := range q.fields { 78 if boost, found := q.fieldBoosts[field]; found { 79 if boost != nil { 80 fields = append(fields, fmt.Sprintf("%s^%f", field, *boost)) 81 } else { 82 fields = append(fields, field) 83 } 84 } else { 85 fields = append(fields, field) 86 } 87 } 88 query["fields"] = fields 89 } 90 91 if q.analyzer != "" { 92 query["analyzer"] = q.analyzer 93 } 94 95 if q.operator != "" { 96 query["default_operator"] = strings.ToLower(q.operator) 97 } 98 99 return source 100} 101