|
@@ -913,6 +913,10 @@ const (
|
|
|
minq = `{"multi_match": {"query": "%s","type": "phrase", "fields": [%s],"analyzer": "my_ngram"}}`
|
|
|
HL = `"highlight": {"pre_tags": [""],"post_tags": [""],"fields": {%s}}`
|
|
|
highlightStr = `%s: {"fragment_size": %d,"number_of_fragments": 1}`
|
|
|
+
|
|
|
+ FilterQuery_New = `{"query":{"bool":{"must": [%s%s%s],"should":[]}}}`
|
|
|
+ MatchQueryString = `{"match": {%s: { "query":"%s", "operator": "and"}}}`
|
|
|
+ HL_New = `"highlight": {"pre_tags": ["<HL>"],"post_tags": ["<HL>"],"fields": {%s}}`
|
|
|
)
|
|
|
|
|
|
func GetNgramQuery(query interface{}, mustquery, findfields string) (qstr string) {
|
|
@@ -945,6 +949,64 @@ func GetNgramQuery(query interface{}, mustquery, findfields string) (qstr string
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+func GetNgramQuery_New(querystring, querymust interface{}, must, findfields string) (qstring string) {
|
|
|
+ querymust_string := ""
|
|
|
+ var wordsMust []string
|
|
|
+ if q, ok := querymust.(string); ok {
|
|
|
+ if q != "" {
|
|
|
+ wordsMust = strings.Split(q, ",")
|
|
|
+ }
|
|
|
+ } else if q, ok := querymust.([]string); ok {
|
|
|
+ wordsMust = q
|
|
|
+ } else if q, ok := querymust.([]interface{}); ok {
|
|
|
+ wordsMust = util.ObjArrToStringArr(q)
|
|
|
+ }
|
|
|
+ if wordsMust != nil {
|
|
|
+ new_minq := fmt.Sprintf(minq, "%s", findfields)
|
|
|
+ musts := []string{}
|
|
|
+ for _, qs_wordsMust := range wordsMust {
|
|
|
+ qws := strings.Split(qs_wordsMust, "+")
|
|
|
+ mq := []string{}
|
|
|
+ for _, qs_word := range qws {
|
|
|
+ mq = append(mq, fmt.Sprintf(new_minq, qs_word))
|
|
|
+ }
|
|
|
+ musts = append(musts, fmt.Sprintf(NgramMust, strings.Join(mq, ",")))
|
|
|
+ }
|
|
|
+ querymust_string = strings.Join(musts, ",")
|
|
|
+ }
|
|
|
+ //log.Println("must", must, querymust_string)
|
|
|
+
|
|
|
+ //querystring---------------------------------------------
|
|
|
+ query_string := ""
|
|
|
+ var querysShold []string
|
|
|
+ if q, ok := querystring.(string); ok {
|
|
|
+ if q != "" {
|
|
|
+ querysShold = strings.Split(q, ",")
|
|
|
+ }
|
|
|
+ } else if q, ok := querystring.([]string); ok {
|
|
|
+ querysShold = q
|
|
|
+ } else if q, ok := querystring.([]interface{}); ok {
|
|
|
+ querysShold = util.ObjArrToStringArr(q)
|
|
|
+ }
|
|
|
+ if querysShold != nil {
|
|
|
+ for k, name := range strings.Split(findfields, ",") {
|
|
|
+ for _, qs_querysShold := range querysShold {
|
|
|
+ if k > 0 {
|
|
|
+ query_string = query_string + "," + fmt.Sprintf(MatchQueryString, fmt.Sprint(name), qs_querysShold)
|
|
|
+ } else {
|
|
|
+ query_string = query_string + fmt.Sprintf(MatchQueryString, fmt.Sprint(name), qs_querysShold)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //log.Println("querystring", query_string)
|
|
|
+ if querymust_string == "" {
|
|
|
+ qstring = fmt.Sprintf(FilterQuery_New, must, query_string, querymust_string)
|
|
|
+ } else {
|
|
|
+ qstring = fmt.Sprintf(FilterQuery_New, must, query_string, ","+querymust_string)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
func GetByNgram(index, itype string, query interface{}, mustquery, findfields, order, fields string, start, limit int) *[]map[string]interface{} {
|
|
|
return GetByNgramAll(index, itype, query, mustquery, findfields, order, fields, start, limit, false, false)
|
|
|
}
|
|
@@ -1016,3 +1078,36 @@ func GetByNgramAll(index, itype string, query interface{}, mustquery, findfields
|
|
|
return nil
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+//增加高亮、过滤查询
|
|
|
+func GetByNgramAll_New(index, itype string, querystring, querymust interface{}, mustquery, findfields, order, fields string, start, limit int, highlight bool, filtermode bool) *[]map[string]interface{} {
|
|
|
+ defer util.Catch()
|
|
|
+ qstr := ""
|
|
|
+ if filtermode {
|
|
|
+ qstr = GetNgramQuery_New(querystring, querymust, mustquery, findfields)
|
|
|
+ } else {
|
|
|
+ qstr = GetNgramQuery_New(querystring, "", mustquery, findfields)
|
|
|
+ }
|
|
|
+ if qstr != "" {
|
|
|
+ if highlight {
|
|
|
+ ws := []string{}
|
|
|
+ for _, w := range strings.Split(findfields, ",") {
|
|
|
+ ws = append(ws, w+`:{"force_source": true}`)
|
|
|
+ }
|
|
|
+ qstr = qstr[:len(qstr)-1] + `,` + fmt.Sprintf(HL_New, strings.Join(ws, ",")) + `}`
|
|
|
+ }
|
|
|
+ if len(fields) > 0 {
|
|
|
+ qstr = qstr[:len(qstr)-1] + `,"_source":[` + fields + "]}"
|
|
|
+ }
|
|
|
+ if len(order) > 0 {
|
|
|
+ qstr = qstr[:len(qstr)-1] + `,"sort":[` + SR(SR(SR(SR(order, ",", ",", -1), " ", "", -1), ":-1", `:"desc"`, -1), ":1", `:"asc"`, -1) + `]}`
|
|
|
+ }
|
|
|
+ if start > -1 {
|
|
|
+ qstr = qstr[:len(qstr)-1] + `,"from":` + strconv.Itoa(start) + `,"size":` + strconv.Itoa(limit) + "}"
|
|
|
+ }
|
|
|
+ //log.Println("ngram-find", order, qstr)
|
|
|
+ return Get(index, itype, qstr)
|
|
|
+ } else {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+}
|