|
@@ -2,9 +2,11 @@ package service
|
|
|
|
|
|
import (
|
|
|
"encoding/json"
|
|
|
+ "fmt"
|
|
|
"log"
|
|
|
qutil "qfw/util"
|
|
|
"strconv"
|
|
|
+ "strings"
|
|
|
"util"
|
|
|
|
|
|
"gopkg.in/mgo.v2/bson"
|
|
@@ -27,6 +29,108 @@ type SieveCondition struct {
|
|
|
Subtype []string //信息类型
|
|
|
}
|
|
|
|
|
|
+//获取vip订阅预览的查询语句
|
|
|
+func GetVIPViewSql(scd *SieveCondition) string {
|
|
|
+ query := `{"query":{"bool":{"must":[%s],"should":[%s],"minimum_should_match": %d}}}`
|
|
|
+ query_bool_should := `{"bool":{"should":[%s],"minimum_should_match": 1}}`
|
|
|
+ multi_match := `{"multi_match": {"query": %s,"type": "phrase", "fields": [%s]}}`
|
|
|
+ query_bool_must_and := `{"bool":{"must":[%s]%s}}`
|
|
|
+
|
|
|
+ bools := []string{}
|
|
|
+ musts := []string{}
|
|
|
+ //省份
|
|
|
+ areaCity := []string{}
|
|
|
+ if len(scd.Area) > 0 {
|
|
|
+ areaquery := `{"terms":{"area":[`
|
|
|
+ for k, v := range scd.Area {
|
|
|
+ if k > 0 {
|
|
|
+ areaquery += `,`
|
|
|
+ }
|
|
|
+ areaquery += `"` + v + `"`
|
|
|
+ }
|
|
|
+ areaquery += `]}}`
|
|
|
+ areaCity = append(areaCity, areaquery)
|
|
|
+ }
|
|
|
+
|
|
|
+ //城市
|
|
|
+ if len(scd.City) > 0 {
|
|
|
+ areaquery := `{"terms":{"city":[`
|
|
|
+ for k, v := range scd.City {
|
|
|
+ if k > 0 {
|
|
|
+ areaquery += `,`
|
|
|
+ }
|
|
|
+ areaquery += `"` + v + `"`
|
|
|
+ }
|
|
|
+ areaquery += `]}}`
|
|
|
+ areaCity = append(areaCity, areaquery)
|
|
|
+ }
|
|
|
+ if len(areaCity) > 0 {
|
|
|
+ musts = append(musts, fmt.Sprintf(query_bool_should, strings.Join(areaCity, ",")))
|
|
|
+ }
|
|
|
+ if len(scd.Subtype) > 0 {
|
|
|
+ subquery := `{"terms":{"subtype":[`
|
|
|
+ for k, v := range scd.Subtype {
|
|
|
+ if k > 0 {
|
|
|
+ subquery += `,`
|
|
|
+ }
|
|
|
+ subquery += `"` + v + `"`
|
|
|
+ }
|
|
|
+ subquery += `]}}`
|
|
|
+ musts = append(musts, subquery)
|
|
|
+ }
|
|
|
+ if len(scd.Buyerclass) > 0 {
|
|
|
+ Buyerclass := `{"terms":{"buyerclass":[`
|
|
|
+ for k, v := range scd.Buyerclass {
|
|
|
+ if k > 0 {
|
|
|
+ Buyerclass += `,`
|
|
|
+ }
|
|
|
+ Buyerclass += `"` + v + `"`
|
|
|
+ }
|
|
|
+ Buyerclass += `]}}`
|
|
|
+ musts = append(musts, Buyerclass)
|
|
|
+ }
|
|
|
+ boolsNum := 0 //should
|
|
|
+ if len(scd.Keyword) > 0 {
|
|
|
+ boolsNum = 1
|
|
|
+ if scd.SelectType == "" || scd.SelectType == "2" {
|
|
|
+ scd.SelectType = "detail\", \"title"
|
|
|
+ } else {
|
|
|
+ scd.SelectType = "title"
|
|
|
+ }
|
|
|
+ multi_match = fmt.Sprintf(multi_match, "%s", "\""+scd.SelectType+"\"")
|
|
|
+
|
|
|
+ for _, v := range scd.Keyword {
|
|
|
+ shoulds := []string{}
|
|
|
+ must_not := []string{}
|
|
|
+ //附加词
|
|
|
+ for _, vv := range v.Keyword {
|
|
|
+ shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+vv+"\""))
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, vv := range v.Appended {
|
|
|
+ shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+vv+"\""))
|
|
|
+ }
|
|
|
+
|
|
|
+ //排除词
|
|
|
+ for _, vv := range v.Exclude {
|
|
|
+ must_not = append(must_not, fmt.Sprintf(multi_match, "\""+vv+"\""))
|
|
|
+ }
|
|
|
+
|
|
|
+ //添加
|
|
|
+ if len(shoulds) > 0 {
|
|
|
+ notStr := ""
|
|
|
+ if len(must_not) > 0 {
|
|
|
+ notStr = fmt.Sprintf(`,"must_not":[%s]`, strings.Join(must_not, ","))
|
|
|
+ }
|
|
|
+ bools = append(bools, fmt.Sprintf(query_bool_must_and, strings.Join(shoulds, ","), notStr))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ qstr := fmt.Sprintf(query, strings.Join(musts, ","), strings.Join(bools, ","), boolsNum)
|
|
|
+ // log.Println("------qstr", qstr)
|
|
|
+ return qstr
|
|
|
+}
|
|
|
func GetSqlObjFromId(_id string) *SieveCondition {
|
|
|
var (
|
|
|
query *map[string]interface{}
|
|
@@ -55,8 +159,19 @@ func getStringArrFromDbResult(area map[string]interface{}, i int) (arr []string)
|
|
|
if area == nil {
|
|
|
return
|
|
|
}
|
|
|
+ var eareArr []string
|
|
|
+ var cityArr []string
|
|
|
for k, v := range area {
|
|
|
- log.Println(k, v)
|
|
|
+ if len(v.([]interface{})) > 0 {
|
|
|
+ cityArr = append(cityArr, qutil.ObjArrToStringArr(v.([]interface{}))...)
|
|
|
+ } else {
|
|
|
+ eareArr = append(eareArr, k)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if i == 1 {
|
|
|
+ arr = eareArr
|
|
|
+ } else {
|
|
|
+ arr = cityArr
|
|
|
}
|
|
|
return
|
|
|
}
|