diff --git a/controllers/BlogController.go b/controllers/BlogController.go index c919d54..61be4cd 100644 --- a/controllers/BlogController.go +++ b/controllers/BlogController.go @@ -122,7 +122,7 @@ func (this *BlogController) Get() { this.Data["Top"] = blogs } //utils.Index() - utils.Save(blog) + utils.ESSave(blog) this.Data["Blog"] = blog this.Data["UserId"] = this.GetSession("userid") this.Data["HeadImg"] = this.GetSession("headimg") @@ -148,6 +148,7 @@ func (this *BlogController) Del() { return } idStr := this.Ctx.Input.Param(":id") + utils.ESDelete(idStr) id, _ := strconv.ParseInt(idStr, 10, 64) blog, err := blogService.GetBlog(id) if err != nil { @@ -221,3 +222,9 @@ func (this *BlogController) BlogsPage() { this.TplName = "blogs.html" } +func (this *BlogController) Search() { + blog, _ := utils.Search("elk") + this.Data["json"] = models.ReurnData("",blog) + this.ServeJSON() +} + diff --git a/main.go b/main.go index 31e9510..cac3094 100644 --- a/main.go +++ b/main.go @@ -20,7 +20,7 @@ func main() { orm.RunSyncdb("default", false, true) beego.AddFuncMap("NAdd",NAdd) - logs.SetLogger(logs.AdapterFile, `{"filename":"/opt/logs/aiprose.log","level":3}`) + logs.SetLogger(logs.AdapterFile, `{"filename":"/opt/logs/aiprose.log","level":1}`) beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{ AllowAllOrigins: true, AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, diff --git a/routers/BlogRouter.go b/routers/BlogRouter.go index 5bc0f7a..0a6a62b 100644 --- a/routers/BlogRouter.go +++ b/routers/BlogRouter.go @@ -13,4 +13,5 @@ func init() { beego.Router("/blog/:id([0-9]+)", &controllers.BlogController{}, "get:Get") beego.Router("/blogs", &controllers.BlogController{}, "get:BlogsPage") beego.Router("/blog/new", &controllers.BlogController{}, "get:New") + beego.Router("/open/blog/search", &controllers.BlogController{}, "get:Search") } diff --git a/utils/EsUtil.go b/utils/EsUtil.go new file mode 100644 index 0000000..fb71277 --- /dev/null +++ b/utils/EsUtil.go @@ -0,0 +1,135 @@ +package utils + +import ( + "beeblog/models" + "context" + "fmt" + "github.com/olivere/elastic" + "log" + "os" + "reflect" + "strconv" + "time" +) +var client *elastic.Client +var host = "http://47.98.109.5:8209" +const mapping = ` +{ + "settings":{ + "number_of_shards": 1, + "number_of_replicas": 0 + }, + "mappings":{ + "beeblog":{ + "properties":{ + "UserId":{ + "type":"long" + }, + "BlogHtml":{ + "type":"text", + "analyzer": "ik_max_word", + "search_analyzer": "ik_smart" + }, + "Ctime":{ + "type":"date" + }, + "Title":{ + "type":"text", + "analyzer": "ik_max_word", + "search_analyzer": "ik_smart" + }, + "Browses":{ + "type":"long" + } + } + } + } +}` + +func init() { + var err error + client, err = elastic.NewClient( + elastic.SetURL(host), + elastic.SetSniff(false), + elastic.SetHealthcheckInterval(10*time.Second), + elastic.SetGzip(true), + elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)), + elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags))) + + if err != nil { + panic(err) + } +} + +func Index() { + ctx := context.Background() + exists, err := client.IndexExists("beeblog").Do(ctx) + if err != nil { + panic(err) + } + if !exists { + createIndex, err := client.CreateIndex("beeblog").BodyString(mapping).Do(ctx) + if err != nil { + panic(err) + } + if !createIndex.Acknowledged { + fmt.Println("请求未被接收到") + } + fmt.Println(createIndex) + } else { + fmt.Println("已经存在beeblog索引") + } +} + +func ESSave(blog *models.Blog) { + ctx := context.Background() + id := strconv.FormatInt(blog.Id,10) + put1, err := client.Index().Index("beeblog").Type("beeblog").Id(id).BodyJson(blog).Do(ctx) + if err != nil { + // Handle error + panic(err) + } + fmt.Printf("Indexed beeblog %s to index %s, type %s\n", put1.Id, put1.Index, put1.Type) +} +//删除 +func ESDelete(id string) { + res, err := client.Delete().Index("beeblog"). + Type("beeblog"). + Id(id). + Do(context.Background()) + if err != nil { + println(err.Error()) + return + } + fmt.Printf("delete result %s\n", res.Result) +} + +func Search(key string) (*models.Blog,error) { + ctx := context.Background() + query := elastic.NewMultiMatchQuery(key,"Title","BlogHtml") + searchResult, err := client.Search(). + Index("beeblog"). // 指定index,返回一个*SearchService对象 + //Type("beeblog"). + Query(query). // 设置查询体,返回同一个*SearchService对象 + //Sort("user", true). // 按照user升序排列 + //From(0).Size(10). // 从第一条数据,找十条,即0-9 + Pretty(true). // 使查询request和返回的结果格式美观 + Do(ctx) // 返回一个*SearchResult + if err != nil { + println("search error",err.Error()) + return nil,err + } + fmt.Printf("找到 [%d] 组tweets\n", searchResult.Hits.TotalHits) + // 查看匹配到多少组数据 + fmt.Printf("找到 [%d] 组tweets\n", searchResult.TotalHits()) + var typ models.Blog + for _, item := range searchResult.Each(reflect.TypeOf(typ)) { //从搜索结果中取数据的方法 + t := item.(models.Blog) + fmt.Printf("%#v\n", t) + return &t,nil + } + if err != nil { + panic(err) + } + return nil,nil +} \ No newline at end of file