项目地址
https://github.com/olivere/elastic
原生API用法
示例代码
package main
import (
"context"
"encoding/json"
"fmt"
"github.com/olivere/elastic/v6"
"reflect"
"strconv"
)
type People struct {
Name string `json:"name"`
Age int `json:"age"`
Birthday string `json:"birthday"`
Desc string `json:"desc"`
}
const mapping = `
{
"mappings": {
"my-type": {
"properties": {
"name": {
"type": "keyword"
},
"age": {
"type": "integer"
},
"birthday": {
"type": "date"
},
"desc": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
}
}
}
`
const (
Url = "http://10.0.0.12:9200"
Index = "my-index"
Type = "my-type"
)
func main() {
ctx := context.Background()
client, err := elastic.NewClient(
elastic.SetURL(Url),
)
if err != nil {
panic(err)
}
defer client.Stop()
/// 索引相关
// 创建索引
createIndexResp, err := client.
CreateIndex(Index).
BodyString(mapping).
Do(ctx)
if err != nil {
panic(err)
}
fmt.Println(createIndexResp)
// 删除索引
deleteIndexResp, err := client.
DeleteIndex(Index).
Do(ctx)
if err != nil {
panic(err)
}
fmt.Println(deleteIndexResp)
// 获取索引列表
catIndicesResp, err := client.
CatIndices().
Do(ctx)
if err != nil {
panic(err)
}
for _, item := range catIndicesResp {
fmt.Println(item.Index)
}
/// 文档操作相关(增删改)
// 创建文档
data := People{
Name: "011",
Age: 25,
Birthday: "2000-01-01",
Desc: "我的名字叫011,我今年23岁了。我出生于2000年1月1日。谢谢大家!",
}
createDocumentResp, err := client.Index().
Index(Index).
Type(Type).
Id("11").
BodyJson(data).
Do(ctx)
if err != nil {
panic(err)
}
fmt.Println(createDocumentResp)
// 批量创建文档
docList := []People{
{"001", 33, "1990-01-01", "我的名字叫001,我今年33岁了。我出生于1990年1月1日。谢谢大家!"},
{"002", 32, "1991-01-01", "我的名字叫002,我今年32岁了。我出生于1991年1月1日。谢谢大家!"},
{"003", 31, "1992-01-01", "我的名字叫003,我今年31岁了。我出生于1992年1月1日。谢谢大家!"},
{"004", 30, "1993-01-01", "我的名字叫004,我今年30岁了。我出生于1993年1月1日。谢谢大家!"},
{"005", 29, "1994-01-01", "我的名字叫005,我今年29岁了。我出生于1994年1月1日。谢谢大家!"},
{"006", 28, "1995-01-01", "我的名字叫006,我今年28岁了。我出生于1995年1月1日。谢谢大家!"},
{"007", 27, "1996-01-01", "我的名字叫007,我今年27岁了。我出生于1996年1月1日。谢谢大家!"},
{"008", 26, "1997-01-01", "我的名字叫008,我今年26岁了。我出生于1997年1月1日。谢谢大家!"},
{"009", 25, "1998-01-01", "我的名字叫009,我今年25岁了。我出生于1998年1月1日。谢谢大家!"},
{"010", 24, "1999-01-01", "我的名字叫010,我今年24岁了。我出生于1999年1月1日。谢谢大家!"},
}
bulkRequest := client.Bulk()
for k, v := range docList {
id := k + 1
idStr := strconv.Itoa(id)
doc := elastic.
NewBulkIndexRequest().
Index(Index).
Type(Type).
Id(idStr).
Doc(v)
bulkRequest = bulkRequest.Add(doc)
}
bulkResp, err := bulkRequest.Do(ctx)
if err != nil {
panic(err)
}
fmt.Println(bulkResp)
// 根据ID删除文档
deleteDocumentResp, err := client.
Delete().
Index(Index).
Type(Type).
Id("1").
Do(ctx)
if err != nil {
panic(err)
}
fmt.Println(deleteDocumentResp)
// 根据条件删除文档
deleteByQueryResp, err := client.
DeleteByQuery(Index).
Type(Type).
Query(elastic.NewMatchQuery("age", 23)).
Do(ctx)
if err != nil {
panic(err)
}
fmt.Println(deleteByQueryResp)
// 根据ID更新文档
updateDocumentResp, err := client.
Update().
Index(Index).
Type(Type).
Id("1").
Doc(map[string]interface{}{
"name": "1",
"age": 0,
"birthday": "1990-01-01",
"desc": "这是一条测试数据",
}).
Do(ctx)
if err != nil {
panic(err)
}
fmt.Println(updateDocumentResp)
// 根据条件更新文档
updateByQueryResp, err := client.
UpdateByQuery(Index).
Type(Type).
Query(elastic.NewMatchQuery("age", 24)).
Script(elastic.NewScript("ctx._source.age=2;ctx._source.desc+=\"增加描述\"")).
Do(ctx)
if err != nil {
panic(err)
}
fmt.Println(updateByQueryResp)
// 根据ID更新文档中的字段
updateDocumentFieldResp, err := client.
Update().
Index(Index).
Type(Type).
Id("1").
Doc(map[string]interface{}{
"age": 1,
}).
Do(ctx)
if err != nil {
panic(err)
}
fmt.Println(updateDocumentFieldResp)
/// 文档查询相关(支持查询指定字段、分页、排序)
var people People
// 获取所有文档
searchAllResp, err := client.
Search(Index).
Query(elastic.NewMatchAllQuery()).
FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
Sort("age", true).
From(0).
Size(2).
Do(ctx)
if err != nil {
panic(err)
}
for _, value := range searchAllResp.Each(reflect.TypeOf(people)) {
if t, ok := value.(People); ok {
fmt.Println(t)
}
}
// 根据ID获取文档
getByIdResp, err := client.
Get().
Index(Index).
Type(Type).
Id("5").
FetchSource(true).
Do(ctx)
if err != nil {
panic(err)
}
err = json.Unmarshal(*getByIdResp.Source, &people)
if err != nil {
panic(err)
}
fmt.Println(people)
// 范围查询
searchByRangeResp, err := client.
Search(Index).
Query(elastic.NewRangeQuery("age").Gte(25).Lt(30)).
FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
Sort("age", true).
From(0).
Size(2).
Do(ctx)
if err != nil {
panic(err)
}
for _, value := range searchByRangeResp.Each(reflect.TypeOf(people)) {
if t, ok := value.(People); ok {
fmt.Println(t)
}
}
// 单个关键词匹配查询
searchByKeywordResp, err := client.
Search(Index).
Query(elastic.NewTermQuery("age", 25)).
FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
Sort("age", true).
From(0).
Size(2).
Do(ctx)
if err != nil {
panic(err)
}
for _, value := range searchByKeywordResp.Each(reflect.TypeOf(people)) {
if t, ok := value.(People); ok {
fmt.Println(t)
}
}
// 多个关键词匹配查询(类似于IN)
searchByKeywordsResp, err := client.
Search(Index).
Query(elastic.NewTermsQuery("name", "001", "002", "003")).
FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
Sort("age", true).
From(0).
Size(2).
Do(ctx)
if err != nil {
panic(err)
}
for _, value := range searchByKeywordsResp.Each(reflect.TypeOf(people)) {
if t, ok := value.(People); ok {
fmt.Println(t)
}
}
// AND条件查询
searchAndResp, err := client.
Search(Index).
Query(elastic.NewBoolQuery().Must(elastic.NewMatchQuery("desc", "谢谢"), elastic.NewMatchQuery("desc", "你"))).
FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
Sort("age", true).
From(0).
Size(2).
Do(ctx)
if err != nil {
panic(err)
}
for _, value := range searchAndResp.Each(reflect.TypeOf(people)) {
if t, ok := value.(People); ok {
fmt.Println(t)
}
}
// OR条件查询
searchOrResp, err := client.
Search(Index).
Query(elastic.NewBoolQuery().Should(elastic.NewMatchQuery("desc", "谢谢"), elastic.NewMatchQuery("desc", "你"))).
FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
Sort("age", true).
From(0).
Size(2).
Do(ctx)
if err != nil {
panic(err)
}
for _, value := range searchOrResp.Each(reflect.TypeOf(people)) {
if t, ok := value.(People); ok {
fmt.Println(t)
}
}
// 查询包含指定字段的文档
searchFieldExistsResp, err := client.
Search(Index).
Query(elastic.NewExistsQuery("name")).
FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
Sort("age", true).
From(0).
Size(2).
Do(ctx)
if err != nil {
panic(err)
}
for _, value := range searchFieldExistsResp.Each(reflect.TypeOf(people)) {
if t, ok := value.(People); ok {
fmt.Println(t)
}
}
// 获取满足条件的文档总数量
count, err := client.
Count(Index).
Query(elastic.NewTermQuery("age", 25)).
Do(ctx)
if err != nil {
panic(err)
}
fmt.Println(count)
}
文档更新时间: 2024-04-20 10:57 作者:lee