一、ElasticSearch连接
1、引入"github.com/olivere/elastic/v7"包
2、连接
client,err :=elastic.NewClient(elastic.SetSniff(false),elastic.SetURL(“服务器地址”),elastic.SetBasicAuth("账号", "密码"))
二、日志上传
1、单条记录上传
_, err :=conn.GetESClient().Index().
Index(index).// 设置索引名称,索引必须为小写字母数字下划线等组成,不得包含大小字母
Id(guid).// 设置文档id,此处id最好为小写字母或数字组成,否则日志虽然插入或查询可行,但是刷新字段时无效
BodyJson(json).// 指定内容
Do(c)// 执行请求,需要传入一个上下文对象
2、批量上传
builService :=conn.GetESClient().Bulk().Index(index)
for _, v :=range logs {
m := v.(map[string]interface{})
if m["guid"] !=nil {
id := m["id"].(string)
doc :=elastic.NewBulkIndexRequest().Id(id).Doc(v)
builService.Add(doc)
}
res, err := builService.Do(c)
三、查询
1、查询(组合)
k:查询字段,v:对应的字符串
boolQuery := elastic.NewBoolQuery().Must()
searchService :=conn.GetESClient().Search()
searchService = searchService.Index(Index).SearchType("query_then_fetch").Pretty(true)
2、分页查询
searchService.From(PageIndex * PageSize)
searchService.Size(PageSize)
3、匹配查询
querys := []elastic.Query{}
//q := elastic.NewMatchQuery(k,v)
//q := elastic.NewWildcardQuery(k,v)
//q := elastic.NewMatchPhraseQuery(k,v).Boost(0.7)
//q := elastic.NewMoreLikeThisQuery().LikeText(v).Field(k)
//q := elastic.NewTermQuery(k,v)
//有特殊字符的如,URL类型查询用此方法,不然查询不到,亲测有效
q :=elastic.NewMatchPhrasePrefixQuery(k,v).MaxExpansions(10)
querys =append(querys,q)
//区间查询(多个)
//如果是字符串类型,字段后面需要加.keyword
k +=".keyword"
rQuery :=elastic.NewRangeQuery(k)
rQuery = rQuery.Gte(itemRange["gte"])
rQuery = rQuery.Lte(itemRange["lte"])
querys =append(querys,rQuery)
boolQuery = boolQuery.Must(querys...)
searchService = searchService.Query(boolQuery)
4、排序查询(多个)
sorters := []elastic.Sorter{}
//此处如果是字符串,后面需加.keyword
k +=".keyword"
sort :=elastic.NewFieldSort(k).Desc()
sorters =append(sorters,sort)
searchService = searchService.SortBy(sorters...)
searchResult, err := searchService.Do(c)
四、删除
1、删除索引
conn.GetESClient().DeleteIndex(indexs...).Do(c)
//删除并清空数据
delAll :=conn.GetESClient().DeleteByQuery()
delAll.Do(c)
2、删除某一条日志
deletService := conn.GetESClient().Delete().// 设置索引名
Index(index)
deletService.Id(guid)
_,err := deletService.Do(c)
五、刷新某个字段值
//入刷新json数据中的status字段位1
script :=fmt.Sprintf("ctx._source['status']=%d",1)
es :=conn.GetESClient()
updateR, err := es.UpdateByQuery(queryIndex).
// 设置查询条件
Query(elastic.NewTermQuery("id",id)).
//同步执行(不设置会异步执行,不能即时刷新,马上查询会没有变化)
Refresh("true").
// 通过脚本更新内容
Script(elastic.NewScript(script)).
// 如果文档版本冲突继续执行
ProceedOnVersionConflict().Do(c)
网友评论