目前golang操作elasticsearch的第三方包中最流行的是:
https://github.com/olivere/elastic
7.x 7.0 github.com/olivere/elastic/v7
6.x 6.0 github.com/olivere/elastic
5.x 5.0 gopkg.in/olivere/elastic.v5
例如:ES版本是7.0以后的版本,就使用github.com/olivere/elastic/v7这个包地址。
package main
import (
"context"
"log"
"reflect"
"github.com/olivere/elastic/v7"
)
func main(){
case1()
}
type Data struct {
Name string `json:"name"`
Country string `json:"country"`
Age int64 `json:"age"`
Date string `json:"date"`
}
// 基础: 增删改查
func case1() {
client, err := elastic.NewClient(
elastic.SetSniff(false), // SetSniff启用或禁用嗅探器(默认情况下启用)。
elastic.SetURL("http://192.168.0.192:9200"), // URL地址
elastic.SetBasicAuth("elastic", "es123456"), // 账号密码
)
if err != nil {
panic(err)
}
log.Println("client = ", client)
//判断索引是否存在
//exists true 表示索引已存在
//exists, err := con.ES().IndexExists(indexName).Do(context.Background())
//删除索引
//_, err = con.ES().DeleteIndex(indexName).Do(context.Background())
// 修改索引
//type mi = map[string]interface{}
//mapping := mi{
// "properties": mi{
// "id": mi{ //整形字段, 允许精确匹配
// "type": "integer",
// },
// },
//}
// conf.ES().PutMapping().Index(indexName).Type("_doc").BodyJson(mapping).Do(context.Background())
//数据迁移
//将一个索引的数据迁移到另一个索引中, 一般用于索引结构发生改变时使用新索引存储数据
//
//type mi = map[string]interface{}
//_, err = conf.ES().Reindex().Body(mi{
// "source": mi{
// "index": oldIndexName,
// },
// "dest": mi{
// "index": newIndexName,
// },
//}).Do(context.Background())
// 插入数据
name := "god"
data := `{
"name": "liman",
"country": "Chian",
"age": 27,
"date": "1995-06-20"
}`
_, err = client.Index().Index(name).Type("g").Id("1").BodyJson(data).Do(context.Background())
if err != nil {
log.Println("插入数据失败: ", err)
}
// 查找数据 通过id 查找
get, err := client.Get().Index(name).Type("g").Id("1").Do(context.Background())
log.Println("查找数据: ", get, err)
log.Println(string(get.Source))
// 修改
res, err := client.Update().
Index(name).
Type("g").
Id("1").
Doc(map[string]interface{}{"age": 88}).
Do(context.Background())
if err != nil {
println(err.Error())
}
log.Printf("update age %s\n", res.Result)
get, err = client.Get().Index(name).Type("g").Id("1").Do(context.Background())
log.Println("查找数据: ", get, err)
log.Println(string(get.Source))
// 删除数据
del, err := client.Delete().Index(name).Type("g").Id("1").Do(context.Background())
log.Println(del, err)
get, err = client.Get().Index(name).Type("g").Id("1").Do(context.Background())
log.Println("查找数据: ", get, err)
// Search
//_, err = conf.ES().Search().
// Index(indexName).
// //偏移量
// From(0).
// //返回数据的条数
// Size(10).
// //指定返回数据的字段(此处指定返回id和name), 全部返回则无需设置
// FetchSourceContext(elastic.NewFetchSourceContext(true).Include("id", "name")).
// //查询条件, 详细配置查询条件请查看章节 5
// Query(query).
// //按照id升序排序, 无需排序则可跳过此设置, 多个Sort会按先后顺序依次生效
// Sort("id", true).
// //自定义排序规则
// SortBy(sorter).
// Do(context.Background())
_, err = client.Index().Index(name).Type("g").Id("1").BodyJson(data).Do(context.Background())
if err != nil {
log.Println("插入数据失败: ", err)
}
data2 := `{
"name": "liman2",
"country": "Chian",
"age": 22,
"date": "1995-06-20"
}`
_, err = client.Index().Index(name).Type("g").Id("2").BodyJson(data2).Do(context.Background())
if err != nil {
log.Println("插入数据失败: ", err)
}
res2, err := client.Search(name).Type("g").Do(context.Background())
log.Println("res2 = ", res2, err)
// 遍历1
var typ Data
for _, item := range res2.Each(reflect.TypeOf(typ)) {
log.Println(item)
}
// 遍历2
for _, v := range res2.Hits.Hits {
log.Println(string(v.Source))
}
// 带条件查询
q := elastic.NewQueryStringQuery("name:liman2")
res3, err := client.Search(name).Type("g").Query(q).Do(context.Background())
for _, v := range res3.Hits.Hits {
log.Println(string(v.Source))
}
// 查询年龄大于25
q1 := elastic.NewRangeQuery("age").Gt(25)
res3, err = client.Search(name).Type("g").Query(q1).Do(context.Background())
for _, v := range res3.Hits.Hits {
log.Println(string(v.Source))
}
// 多个条件
boolq := elastic.NewBoolQuery()
boolq.Must(elastic.NewMatchQuery("name", "liman2"))
boolq.Filter(elastic.NewRangeQuery("age").Gt(21))
res3, err = client.Search(name).Type("g").Query(boolq).Do(context.Background())
for _, v := range res3.Hits.Hits {
log.Println(string(v.Source))
}
// 分页
pg := 1
size := 1
res3, err = client.Search(name).Type("g").Size(size).From((pg - 1) * 1).Do(context.Background())
for _, v := range res3.Hits.Hits {
log.Println("分页: ", string(v.Source))
}
// range 范围匹配
// id >= 10, id <= 100
q4 := elastic.NewRangeQuery("age").Gte(20).Lte(25)
res3, err = client.Search(name).Type("g").Query(q4).Do(context.Background())
for _, v := range res3.Hits.Hits {
log.Println("范围匹配 = ", string(v.Source))
}
// name字段模糊匹配
q3 := elastic.NewMatchQuery("name", "*li*")
res3, err = client.Search(name).Type("g").Query(q3).Do(context.Background())
log.Println(res3, err)
for _, v := range res3.Hits.Hits {
log.Println("name字段模糊匹配 = ", string(v.Source))
}
}
/*
条件查询
var query elastic.Query
// match_all
query = elastic.NewMatchAllQuery()
// term
query = elastic.NewTermQuery("field_name", "field_value")
// terms
query = elastic.NewTermsQuery("field_name", "field_value")
// match
query = elastic.NewMatchQuery("field_name", "field_value")
// match_phrase
query = elastic.NewMatchPhraseQuery("field_name", "field_value")
// match_phrase_prefix
query = elastic.NewMatchPhrasePrefixQuery("field_name", "field_value")
//range Gt:大于; Lt:小于; Gte:大于等于; Lte:小于等
query = elastic.NewRangeQuery("field_name").Gte(1).Lte(2)
//regexp
query = elastic.NewRegexpQuery("field_name", "regexp_value")
_, err := client.Search().Index("index_name").Query(query).Do(context.Background())
if err != nil {
panic(err)
}
//排序顺序, true为降徐, false为升序
client.Search().Index("index_name").Sort("field_name", true).Do(context.Background())
// 还可以通过SortBy进行多个排序
sorts := []elastic.Sorter{
elastic.NewFieldSort("field_name01").Asc(), // 升序
elastic.NewFieldSort("field_name02").Desc(), // 降徐
}
client.Search().Index("index_name").SortBy(sorts...).Do(context.Background())
*/