package elasticSearch
import (
"CommentDesign/model"
"context"
"fmt"
"github.com/olivere/elastic/v7"
"log"
"os"
"time"
)
//todo input: contextId :keyword content:text类型 authorId:keyword类型 creatAt:date
//TODO 这里面还要存一下 commentId replyID
var mapping = `
{
"settings":{
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings":{
"properties":{
"commentOrReplyId":{
"type":"keyword"
},
"contextId":{
"type":"keyword"
},
"content":{
"type":"text"
},
"authorId":{
"type":"keyword"
},
"creatAt":{
"type":"date"
},
"belongTo":{
"type":"keyword"
}
}
}
}`
var index string
//index = "contextId:0"
//todo 这个check索引是非常必要的 有索引的话 我为什么要新建一个索引 呢 这个就好奇怪呀
func buildMappingConstraint(ctx context.Context,client *elastic.Client,contextId string) error{
index = "contextid"+contextId
// Use the IndexExists service to check if a specified index exists.
exists, err := client.IndexExists(index).Do(ctx)
if err != nil {
// Handle error
panic(err)
return err
}
//if index does not exist, create a new one with the specified mapping
if !exists {
createIndex, err := client.CreateIndex(index).BodyString(mapping).Do(ctx)
if err != nil {
panic(err)
return err
}
if !createIndex.Acknowledged {
log.Println(createIndex)
} else {
log.Println("successfully created index")
}
} else {
log.Println("Index already exist")
}
return nil
}
func DeliverToEsNormalComment(commentId string,contextId string,content string,authorId string)error{
client, err := elastic.NewClient(
// elasticsearch 服务地址,多个服务地址使用逗号分隔
elastic.SetURL("http://127.0.0.1:9200"),
// 基于http base auth验证机制的账号和密码
//elastic.SetBasicAuth("user", "secret"),
// 启用gzip压缩
//elastic.SetGzip(true),
// 设置监控检查时间间隔
elastic.SetHealthcheckInterval(10*time.Second),
// 设置请求失败最大重试次数
elastic.SetMaxRetries(5),
// 设置错误日志输出
elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)),
// 设置info日志输出
elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)))
if err != nil {
// Handle error
fmt.Printf("连接失败: %v\n", err)
} else {
fmt.Println("连接成功")
}
ctx := context.Background()
// 定义一篇博客
err=buildMappingConstraint(ctx,client,contextId)
if err!=nil{
return err
}
//todo input: contextId :keyword commentID (这个要从sql型数据库里面获取了吧) content:text类型 documentId(自动生成哈) authorId:keyword类型 creatAt:date
////这个后面就是建立这个index 的document啥的
//这里面要存一下paperId吧 不然你怎么获得详细的信息呢
//TODO 这里面要传入 commentId 吧 因为后面 会根据commentId 来获得这个评论的详细信息
//TODO 这个commentId 就这样用了 就是不要改变一下表结构
//commentId:="1"
//"properties":{
// "commentOrReplyId":{
// "type":"keyword"
// },
// "contextId":{
// "type":"keyword"
// },
// "content":{
// "type":"text"
// },
// "authorId":{
// "type":"keyword"
// },
// "creatAt":{
// "type":"date"
// },
// "belongTo":{
// "type":"keyword"
// }
comment:=model.CommentESModified{
CommentOrReplyId: commentId,
ContextId:contextId,
Content: content ,
AuthorId: authorId,
BelongTo:"normalComment",
CreatAt: time.Now(),
}
//todo 感觉这个contextId这个字段都没什么用
// 把这个commentId 当成documentId呗 就是 别用ES再去自动生成 documentId了 能区分就好了呗
documentId:=commentId
//todo 终于不用担心documentId的问题了
put1, err := client.Index().
Index(index). // 设置索引名称
Id(documentId). // 设置文档id todo 这个如何自动设置文档的id
BodyJson(comment). // 指定前面声明struct对象
Do(ctx) // 执行请求,需要传入一个上下文对象
//Id("1"). // 设置文档id
//put1, err := client.Index().
// Index(index). // 设置索引名称
// BodyJson(comment). // 指定前面声明struct对象
// Do(ctx) // 执行请求,需要传入一个上下文对象
if err != nil {
// Handle error
panic(err)
return err
}
fmt.Println(put1)
return nil
}
func DeliverToEsReply(commentId string,contextId string,content string,authorId string)error{
client, err := elastic.NewClient(
// elasticsearch 服务地址,多个服务地址使用逗号分隔
elastic.SetURL("http://127.0.0.1:9200"),
// 基于http base auth验证机制的账号和密码
//elastic.SetBasicAuth("user", "secret"),
// 启用gzip压缩
//elastic.SetGzip(true),
// 设置监控检查时间间隔
elastic.SetHealthcheckInterval(10*time.Second),
// 设置请求失败最大重试次数
elastic.SetMaxRetries(5),
// 设置错误日志输出
elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)),
// 设置info日志输出
elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)))
if err != nil {
// Handle error
fmt.Printf("连接失败: %v\n", err)
} else {
fmt.Println("连接成功")
}
ctx := context.Background()
// 定义一篇博客
err=buildMappingConstraint(ctx,client,contextId)
if err!=nil{
return err
}
//todo input: contextId :keyword commentID (这个要从sql型数据库里面获取了吧) content:text类型 documentId(自动生成哈) authorId:keyword类型 creatAt:date
////这个后面就是建立这个index 的document啥的
//这里面要存一下paperId吧 不然你怎么获得详细的信息呢
//TODO 这里面要传入 commentId 吧 因为后面 会根据commentId 来获得这个评论的详细信息
//TODO 这个commentId 就这样用了 就是不要改变一下表结构
//commentId:="1"
//"properties":{
// "commentOrReplyId":{
// "type":"keyword"
// },
// "contextId":{
// "type":"keyword"
// },
// "content":{
// "type":"text"
// },
// "authorId":{
// "type":"keyword"
// },
// "creatAt":{
// "type":"date"
// },
// "belongTo":{
// "type":"keyword"
// }
comment:=model.CommentESModified{
CommentOrReplyId: commentId,
ContextId:contextId,
Content: content ,
AuthorId: authorId,
BelongTo:"reply",
CreatAt: time.Now(),
}
//todo 感觉这个contextId这个字段都没什么用
// 把这个commentId 当成documentId呗 就是 别用ES再去自动生成 documentId了 能区分就好了呗
documentId:=commentId
//todo 终于不用担心documentId的问题了
put1, err := client.Index().
Index(index). // 设置索引名称
Id(documentId). // 设置文档id todo 这个如何自动设置文档的id
BodyJson(comment). // 指定前面声明struct对象
Do(ctx) // 执行请求,需要传入一个上下文对象
//Id("1"). // 设置文档id
//put1, err := client.Index().
// Index(index). // 设置索引名称
// BodyJson(comment). // 指定前面声明struct对象
// Do(ctx) // 执行请求,需要传入一个上下文对象
if err != nil {
// Handle error
panic(err)
return err
}
fmt.Println(put1)
return nil
}
//fmt.Printf("文档Id %s, 索引名 %s\n", put1.Id, put1.Index)
//"content":{
// "type":"text"
//},
//"authorId":{
// "type":"keyword"
//},
//"creatAt":{
// "type":"date"
//}
//comment := Article{"commentId":1, "content":"go如何操作ES", "authorId":"tizi", creatAt:time.Now()}
//// 使用client创建一个新的文档
//"contextId":{
// "type":"keyword"
//},
package elasticSearch
import (
"CommentDesign/model"
"context"
"fmt"
"github.com/olivere/elastic/v7"
"log"
"os"
"time"
)
//todo input: contextId :keyword content:text类型 authorId:keyword类型 creatAt:date
//TODO 这里面还要存一下 commentId replyID
var mapping = `
{
"settings":{
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings":{
"properties":{
"commentOrReplyId":{
"type":"keyword"
},
"contextId":{
"type":"keyword"
},
"content":{
"type":"text"
},
"authorId":{
"type":"keyword"
},
"creatAt":{
"type":"date"
},
"belongTo":{
"type":"keyword"
}
}
}
}`
var index string
//index = "contextId:0"
//todo 这个check索引是非常必要的 有索引的话 我为什么要新建一个索引 呢 这个就好奇怪呀
func buildMappingConstraint(ctx context.Context,client *elastic.Client,contextId string) error{
index = "contextid"+contextId
// Use the IndexExists service to check if a specified index exists.
exists, err := client.IndexExists(index).Do(ctx)
if err != nil {
// Handle error
panic(err)
return err
}
//if index does not exist, create a new one with the specified mapping
if !exists {
createIndex, err := client.CreateIndex(index).BodyString(mapping).Do(ctx)
if err != nil {
panic(err)
return err
}
if !createIndex.Acknowledged {
log.Println(createIndex)
} else {
log.Println("successfully created index")
}
} else {
log.Println("Index already exist")
}
return nil
}
func DeliverToEsNormalComment(commentId string,contextId string,content string,authorId string)error{
client, err := elastic.NewClient(
// elasticsearch 服务地址,多个服务地址使用逗号分隔
elastic.SetURL("http://127.0.0.1:9200"),
// 基于http base auth验证机制的账号和密码
//elastic.SetBasicAuth("user", "secret"),
// 启用gzip压缩
//elastic.SetGzip(true),
// 设置监控检查时间间隔
elastic.SetHealthcheckInterval(10*time.Second),
// 设置请求失败最大重试次数
elastic.SetMaxRetries(5),
// 设置错误日志输出
elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)),
// 设置info日志输出
elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)))
if err != nil {
// Handle error
fmt.Printf("连接失败: %v\n", err)
} else {
fmt.Println("连接成功")
}
ctx := context.Background()
// 定义一篇博客
err=buildMappingConstraint(ctx,client,contextId)
if err!=nil{
return err
}
//todo input: contextId :keyword commentID (这个要从sql型数据库里面获取了吧) content:text类型 documentId(自动生成哈) authorId:keyword类型 creatAt:date
////这个后面就是建立这个index 的document啥的
//这里面要存一下paperId吧 不然你怎么获得详细的信息呢
//TODO 这里面要传入 commentId 吧 因为后面 会根据commentId 来获得这个评论的详细信息
//TODO 这个commentId 就这样用了 就是不要改变一下表结构
//commentId:="1"
//"properties":{
// "commentOrReplyId":{
// "type":"keyword"
// },
// "contextId":{
// "type":"keyword"
// },
// "content":{
// "type":"text"
// },
// "authorId":{
// "type":"keyword"
// },
// "creatAt":{
// "type":"date"
// },
// "belongTo":{
// "type":"keyword"
// }
comment:=model.CommentESModified{
CommentOrReplyId: commentId,
ContextId:contextId,
Content: content ,
AuthorId: authorId,
BelongTo:"normalComment",
CreatAt: time.Now(),
}
//todo 感觉这个contextId这个字段都没什么用
// 把这个commentId 当成documentId呗 就是 别用ES再去自动生成 documentId了 能区分就好了呗
documentId:=commentId
//todo 终于不用担心documentId的问题了
put1, err := client.Index().
Index(index). // 设置索引名称
Id(documentId). // 设置文档id todo 这个如何自动设置文档的id
BodyJson(comment). // 指定前面声明struct对象
Do(ctx) // 执行请求,需要传入一个上下文对象
//Id("1"). // 设置文档id
//put1, err := client.Index().
// Index(index). // 设置索引名称
// BodyJson(comment). // 指定前面声明struct对象
// Do(ctx) // 执行请求,需要传入一个上下文对象
if err != nil {
// Handle error
panic(err)
return err
}
fmt.Println(put1)
return nil
}
func DeliverToEsReply(commentId string,contextId string,content string,authorId string)error{
client, err := elastic.NewClient(
// elasticsearch 服务地址,多个服务地址使用逗号分隔
elastic.SetURL("http://127.0.0.1:9200"),
// 基于http base auth验证机制的账号和密码
//elastic.SetBasicAuth("user", "secret"),
// 启用gzip压缩
//elastic.SetGzip(true),
// 设置监控检查时间间隔
elastic.SetHealthcheckInterval(10*time.Second),
// 设置请求失败最大重试次数
elastic.SetMaxRetries(5),
// 设置错误日志输出
elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)),
// 设置info日志输出
elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)))
if err != nil {
// Handle error
fmt.Printf("连接失败: %v\n", err)
} else {
fmt.Println("连接成功")
}
ctx := context.Background()
// 定义一篇博客
err=buildMappingConstraint(ctx,client,contextId)
if err!=nil{
return err
}
//todo input: contextId :keyword commentID (这个要从sql型数据库里面获取了吧) content:text类型 documentId(自动生成哈) authorId:keyword类型 creatAt:date
////这个后面就是建立这个index 的document啥的
//这里面要存一下paperId吧 不然你怎么获得详细的信息呢
//TODO 这里面要传入 commentId 吧 因为后面 会根据commentId 来获得这个评论的详细信息
//TODO 这个commentId 就这样用了 就是不要改变一下表结构
//commentId:="1"
//"properties":{
// "commentOrReplyId":{
// "type":"keyword"
// },
// "contextId":{
// "type":"keyword"
// },
// "content":{
// "type":"text"
// },
// "authorId":{
// "type":"keyword"
// },
// "creatAt":{
// "type":"date"
// },
// "belongTo":{
// "type":"keyword"
// }
comment:=model.CommentESModified{
CommentOrReplyId: commentId,
ContextId:contextId,
Content: content ,
AuthorId: authorId,
BelongTo:"reply",
CreatAt: time.Now(),
}
//todo 感觉这个contextId这个字段都没什么用
// 把这个commentId 当成documentId呗 就是 别用ES再去自动生成 documentId了 能区分就好了呗
documentId:=commentId
//todo 终于不用担心documentId的问题了
put1, err := client.Index().
Index(index). // 设置索引名称
Id(documentId). // 设置文档id todo 这个如何自动设置文档的id
BodyJson(comment). // 指定前面声明struct对象
Do(ctx) // 执行请求,需要传入一个上下文对象
//Id("1"). // 设置文档id
//put1, err := client.Index().
// Index(index). // 设置索引名称
// BodyJson(comment). // 指定前面声明struct对象
// Do(ctx) // 执行请求,需要传入一个上下文对象
if err != nil {
// Handle error
panic(err)
return err
}
fmt.Println(put1)
return nil
}
//fmt.Printf("文档Id %s, 索引名 %s\n", put1.Id, put1.Index)
//"content":{
// "type":"text"
//},
//"authorId":{
// "type":"keyword"
//},
//"creatAt":{
// "type":"date"
//}
//comment := Article{"commentId":1, "content":"go如何操作ES", "authorId":"tizi", creatAt:time.Now()}
//// 使用client创建一个新的文档
//"contextId":{
// "type":"keyword"
//},