创建索引 :
请求地址: youku/_doc/_mapping?pretty&include_type_name=true
json参数: 分词器:ik分词器 , 搜索分词器:ik分词器
{"properties":{"id":{"type":"integer"},"title":{"type":"text","analyzer":"ik_max_word","search_analyzer":"ik_max_word"}}}
Beego封装Es
package es
import (
"encoding/json"
"fmt"
"github.com/astaxie/beego/httplib"
)
var esUrl string
func init() {
esUrl = "http://39.105.156.191:9200/"
}
type ReqSearchData struct {
Hits HitsData `json:"hits"`
}
type HitsData struct {
Total TotalData `json:"total"`
Hits []HitsTwoData `json:"hits"`
}
type HitsTwoData struct {
Source json.RawMessage `json:"_source"`
}
type TotalData struct {
Value int
Relation string
}
/**
搜索
indexName 访问索引名
query 搜索条件
from 开始搜索位置
size 搜索条数
sort 排序
*/
func EsSearch(indexName string, query map[string]interface{}, from int, size int, sort []map[string]string) HitsData {
searchQuery := map[string]interface{}{
"query": query,
"from": from,
"size": size,
"sort": sort,
}
req := httplib.Post(esUrl + indexName + "/_search")
req.JSONBody(searchQuery)
str, err := req.String()
if err != nil {
fmt.Println("elasticsearch is error ", err)
}
fmt.Println(str)
var stb ReqSearchData
err = json.Unmarshal([]byte(str), &stb)
return stb.Hits
}
/**
添加es
indexName 索引名
id es的id
body es的值
*/
func EsAdd(indexName string, id string, body map[string]interface{}) bool {
req := httplib.Post(esUrl + indexName + "/_doc/" + id)
req.JSONBody(body)
_, err := req.String()
if err != nil {
fmt.Println("elasticsearch is error ", err)
return false
}
return true
}
/**
修改es
indexName 索引名
id es的id
body es的值
*/
func EsUpdate(indexName string, id string, body map[string]interface{}) bool {
bodyData := map[string]interface{}{
"doc": body,
}
req := httplib.Post(esUrl + indexName + "/_doc/" + id + "/_update")
req.JSONBody(bodyData)
_, err := req.String()
if err != nil {
fmt.Println("elasticsearch is error ", err)
return false
}
return true
}
/**
删除
indexName 索引名
id es的id
*/
func EsDelete(indexName string, id string) bool {
req := httplib.Delete(esUrl + indexName + "/_doc/" + id)
_, err := req.String()
if err != nil {
fmt.Println("elasticsearch is error ", err)
return false
}
return true
}
Beego使用Es增删改查demo
package controllers
import (
"encoding/json"
"fmt"
"github.com/astaxie/beego"
"youku/services/es"
)
type EsDemoController struct {
beego.Controller
}
type ResData struct {
Id int `json:"id"`
Title string `json:"title"`
}
// 搜索es
// @router /es/search [*]
func (this *EsDemoController) Search() {
sort := []map[string]string{map[string]string{"id": "desc"}}
query := map[string]interface{}{
"bool": map[string]interface{}{
"must": map[string]interface{}{
"term": map[string]interface{}{
"id": 1,
},
},
},
}
res := es.EsSearch("youku", query, 0, 10, sort)
total := res.Total
var resData []ResData
for _, v := range res.Hits {
var data ResData
err := json.Unmarshal(v.Source, &data)
if err != nil {
fmt.Println("查询json错误", err)
}
resData = append(resData, data)
}
fmt.Println(total)
fmt.Println(resData)
this.Ctx.WriteString("search")
}
// 添加数据到es
// @router /es/add [*]
func (this *EsDemoController) Add() {
body := map[string]interface{}{
"id": 1,
"title": "张三",
}
s := es.EsAdd("youku", "user-1", body)
fmt.Println(s)
this.Ctx.WriteString("添加到ES")
}
// 修改数据到es
// @router /es/edit [*]
func (this *EsDemoController) Edit() {
body := map[string]interface{}{
"id": 2,
"title": "李四",
}
s := es.EsUpdate("youku", "user-1", body)
fmt.Println(s)
this.Ctx.WriteString("修改到ES")
}
// 删除数据到es
// @router /es/delete [*]
func (this *EsDemoController) Delete() {
s := es.EsDelete("youku", "user-1")
fmt.Println(s)
this.Ctx.WriteString("修改到ES")
}
项目中实现
创建mapping , 这里的类型和字段和数据库一致
{"properties":{"id":{"type":"integer"},"title":{"type":"text","analyzer":"ik_max__word","search_analyzer":"ik_max_word"},"sub_title":{"type":"text","analyzer":"ik_max__word","search_analyzer":"ik_max_word"},"status":{"type":"integer"},"add_time":{"type":"integer"},"img":{"type":"keyword"},"img1":{"type":"keyword"},"channel_id":{"type":"integer"},"type_id":{"type":"integer"},"region_id":{"type":"integer"},"user_id":{"type":"integer"},"episodes_count":{"type":"integer"},"episodes_update_time":{"type":"integer"},"is_hot":{"type":"integer"},"is_end":{"type":"integer"},"is_recommend":{"type":"integer"},"comment":{"type":"integer"}}}
代码
//导入es
// @router /video/es/send [*]
func (this *VideoController) SendEs() {
_, data, _ := models.GetAllList() // mysql获取所有的数据
for _, v := range data {
body := map[string]interface{}{
"id": v.Id,
"title": v.Title,
"sub_title": v.SubTitle,
"add_time": v.AddTime,
"img": v.Img,
"img1": v.Img1,
"espisodes_count": v.EpisodesCount,
"espisodes_update_time": v.EpisodesUpdateTime,
"channel_id": v.ChannelId,
"type_id": v.TypeId,
"status": v.Status,
"region_id": v.RegionId,
"user_id": v.UserId,
"is_end": v.IsEnd,
"is_recommend": v.IsRecommend,
"comment": v.Comment,
}
es.EsAdd("youku_video", "video-"+strconv.Itoa(v.Id), body)
}
this.Ctx.WriteString("导入es成功")
}
// 搜索接口
// @router /video/search [*]
func (this *VideoController) SearchEs() {
keyword := this.GetString("keyword", "")
if keyword == "" {
this.Data["json"] = ReturnError(4001, "关键字不能为空")
this.ServeJSON()
}
limit, _ := this.GetInt("limit")
offset, _ := this.GetInt("offset")
if limit == 0 {
limit = 12
}
sort := []map[string]string{map[string]string{"id": "desc"}}
query := map[string]interface{}{
"bool": map[string]interface{}{
"must": map[string]interface{}{
"term": map[string]interface{}{
"title": keyword,
},
},
},
}
res := es.EsSearch("youku_video", query, offset, limit, sort)
total := res.Total.Value
var data []models.Video
for _, v := range res.Hits {
var itemData models.Video
err := json.Unmarshal([]byte(v.Source), &itemData)
if err == nil {
data = append(data, itemData)
}
}
this.Data["json"] = ReturnSuccess(0, "查询成功", data, int64(total))
this.ServeJSON()
}
多条件查询
func GetChannelVideoList(channelId int, regionId int, typeId int, end string, sort string, offset int, limit int) (int64, []orm.Params, error) {
o := orm.NewOrm()
var videos []orm.Params
qs := o.QueryTable("video")
qs = qs.Filter("channel_id", channelId)
qs = qs.Filter("status", 1)
if regionId > 0 {
qs = qs.Filter("region_id", regionId)
}
if typeId > 0 {
qs = qs.Filter("type_id", typeId)
}
if end == "n" {
qs = qs.Filter("is_end", 0)
} else if end == "y" {
qs = qs.Filter("is_end", 1)
}
if sort == "episodesUpdateTime" {
qs = qs.OrderBy("-episodes_update_time")
} else if sort == "comment" {
qs = qs.OrderBy("-comment")
} else if sort == "addTime" {
qs = qs.OrderBy("-add_time")
} else {
qs = qs.OrderBy("-add_time")
}
nums, _ := qs.Values(&videos, "id", "title", "sub_title", "add_time", "img", "img1", "episodes_count", "is_end")
qs = qs.Limit(limit, offset)
_, err := qs.Values(&videos, "id", "title", "sub_title", "add_time", "img", "img1", "episodes_count", "is_end")
return nums, videos, err
}
func GetChannelVideoListEs(channelId int, regionId int, typeId int, end string, sort string, offset int, limit int) (int64, []Video, error) {
query := make(map[string]interface{})
bools := make(map[string]interface{})
var must []map[string]interface{}
must = append(must, map[string]interface{}{"term": map[string]interface{}{
"channel_id": channelId,
}})
must = append(must, map[string]interface{}{"term": map[string]interface{}{
"status": 1,
}})
if regionId > 0 {
must = append(must, map[string]interface{}{"term": map[string]interface{}{
"region_id": regionId,
}})
}
if typeId > 0 {
must = append(must, map[string]interface{}{"term": map[string]interface{}{
"type_id": typeId,
}})
}
if end == "n" {
must = append(must, map[string]interface{}{"term": map[string]interface{}{
"is_end": 0,
}})
} else if end == "y" {
must = append(must, map[string]interface{}{"term": map[string]interface{}{
"is_end": 1,
}})
}
bools["must"] = must
query["bool"] = bools
sortData := []map[string]string{map[string]string{"add_time": "desc"}}
if sort == "episodesUpdateTime" {
sortData = []map[string]string{map[string]string{"episodes_update_time": "desc"}}
} else if sort == "comment" {
sortData = []map[string]string{map[string]string{"comment": "desc"}}
} else if sort == "addTime" {
sortData = []map[string]string{map[string]string{"add_time": "desc"}}
}
res := es.EsSearch("fyouku_video", query, offset, limit, sortData)
total := res.Total.Value
var data []Video
for _, v := range res.Hits {
var itemData Video
err := json.Unmarshal([]byte(v.Source), &itemData)
if err == nil {
data = append(data, itemData)
}
}
return int64(total), data, nil
}