blog_backend_api/model/port.go

189 lines
3.9 KiB
Go

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())
}
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 {
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
}