package model import ( "background/db" "strings" "ubntgo/logger" "github.com/go-openapi/errors" json "github.com/json-iterator/go" "gopkg.in/olivere/elastic.v3" "qiniupkg.com/x/log.v7" ) type Field struct { Field string `sql:"Field"` Type string `sql:"Type"` Key string `sql:"Key"` } func MysqlToElasticSearchMapping(types string, Key string) string { if Key == "PRI" { return "keyword" } if strings.Contains(types, "int(") { return "integer" } if strings.Contains(types, "longblob") { return "text" } if strings.Contains(types, "varchar") { return "text" } if strings.Contains(types, "datetime") { return "date" } return "" } /* "settings":{ "number_of_shards":1, "number_of_replicas":0 }, "mappings":{ "properties":{ "user":{ "type":"keyword" }, "message":{ "type":"text", "store": true, "fielddata": true }, "tags":{ "type":"keyword" }, "location":{ "type":"geo_point" }, "suggest_field":{ "type":"completion" } } } */ // 不同类型db之间进行缓存 func QueryDocument(query elastic.Query, limit int, offset int) ([]Hardware, error) { var ret []Hardware ids, e := db.GetElastic().Query("doc", query, ret, limit, offset) if nil != e { return nil, e } i := 0 for _, v := range ids { ret[i].ID = v i++ } return ret, nil } func InsertDocToElaticSearch(doc Doc) error { matchPhraseQuery := elastic.NewMatchQuery("title", doc.Title) existedHardware, e := QueryHardwares(matchPhraseQuery, 10, 0) log.Print(e, existedHardware) for _, v := range existedHardware { if v.Name == doc.Title { log.Print(v.ID) return errors.New(200, "existed title") } } e = db.GetElastic().Create("doc", "0", "", doc) if nil != e { log.Print(e.Error()) return e } return nil } func CreateIndexFromMysqlTable(tblname string) error { columns := []Field{} e := db.GetMysqlClient().Query2("describe " + tblname, &columns) if nil != e { logger.Debug(e.Error()) return e } if existed, _ := db.GetElastic().IndexExisted(tblname); existed { log.Print("index not existed , create " + tblname) } else { props := map[string]interface{}{} mapping := map[string]interface{}{ "settings": map[string]interface{}{ "analysis": map[string]interface{}{ "analyzer": map[string]interface{}{ "default": map[string]interface{}{ "type": "smartcn", }, }, }, }, "mappings": map[string]interface{}{ "properties": props, }, } for _, v := range columns { props[v.Field] = map[string]string{"type": MysqlToElasticSearchMapping(v.Type, v.Key)} } dat, e := json.Marshal(mapping) if nil != e { log.Print(e.Error()) } e = db.GetElastic().CreateIndex(tblname, string(dat)) if nil != e { log.Print(e.Error()) } log.Print(string(dat)) } return nil } func PortDocumentToElasticsearch(tblname string) error { ret, e := GetAllDocs() if nil != e { log.Print(e.Error()) } insert, err := json.Marshal(ret) if nil != err { log.Print(err) } log.Print(len(ret)) log.Print(string(insert)) columns := []Field{} e = db.GetMysqlClient().Query2("describe "+tblname, &columns) if nil != e { logger.Debug(e.Error()) return e } if existed, _ := db.GetElastic().IndexExisted(tblname); existed { for _, v := range ret { e := InsertDocToElaticSearch(v) if nil != e { log.Print(e.Error()) } } } else { props := map[string]interface{}{} mapping := map[string]interface{}{ "settings": map[string]interface{}{ "analysis": map[string]interface{}{ "analyzer": map[string]interface{}{ "default": map[string]interface{}{ "type": "smartcn", }, }, }, }, "mappings": map[string]interface{}{ "properties": props, }, } for _, v := range columns { props[v.Field] = map[string]string{"type": MysqlToElasticSearchMapping(v.Type, v.Key)} } dat, e := json.Marshal(mapping) if nil != e { log.Print(e.Error()) } e = db.GetElastic().CreateIndex(tblname, string(dat)) if nil != e { log.Print(e.Error()) } log.Print(string(dat)) for _, v := range ret { e := InsertDocToElaticSearch(v) if nil != e { log.Print(e.Error()) } } } return nil }