GO语言操作Elasticsearch示例分享

 更新时间:2023年01月17日 08:42:26   作者:93年的老男孩  
这篇文章主要介绍了GO语言操作Elasticsearch示例分享的相关资料,需要的朋友可以参考下

Elasticsearch简介

Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库–无论是开源还是私有。

连接Elasticsearch

// 引入g~
~~~~~-elasticsearch
import (
    es8 "github.com/elastic/go-elasticsearch/v8"
)

// go-es配置
conf := es8.Config{
    Addresses: "http://127.0.0.1:9200",
    Username:"elastic",
    Password:"jloMQ7ZCTlcZUr_hmDoB",
}

// 创建
client, err := es8.NewClient(conf);
if err != nil{
    fmt.Println("=============  创建 elasticsearch 失败  =============")
    return 
}

// 连接
_, err1 := client.Info()
if err1 != nil{
    fmt.Println("=============  连接 elasticsearch 失败  =============")
    return 
}

创建索引

创建model结构体

type Admin struct{
    Id int `gorm:"<-" json:"id"` 
    UserName string `gorm:"<-" json:"user_name"` 
    RealName string `gorm:"<-" json:"real_name"` 
    Mobile string `gorm:"<-" json:"mobile"` 
}

初始化model

admin := Admin{
    Id: 1,
    UserName: "test",
    RealName: "测试",
    Mobile: "15222222222",
}

创建索引

// 结构体json序列化
str,err := json.Marshal(admin);
if err != nil{
    return ;
}

// 创建索引
res1, err1 := client.Index(
    "db.table",
    bytes.NewReader(str),
    client.Index.WithDocumentID("1"), // 索引ID
    client.Index.WithRefresh("true") //是否立即创建
);

搜索数据

创建返回结构体

type EsResponse struct{
    Hits struct{
        Total struct{
            Value int `json:"value"` 
        } `json:"total"` 
        Hits []struct{
            Index string `json:"_index"` 
            Id string `json:"_id"` 
            Score float32 `json:"_score"` 
            Source map[string]any `json:"_source"` 
        } `json:"hits"` 
    } `json:"hits"` 
}

type EsData struct{
    Total int `json:"total"` 
    List []map[string]any `json:"list"` 
}

搜索数据

query := map[string]any{
    "query":map[string]any{
        "bool":map[string]any{
            "must":[]map[string]any{
                map[string]any{
                    "match_phrase":map[string]any{
                        "user_name": "test",
                    },
                },
                map[string]any{
                    "match_phrase":map[string]any{
                        "mobile": "15222222222",
                    },
                },
            },
        },
    },
}

str,err := json.Marshal(query);
if err != nil{
    return ;
}

res1,err1 := client.Search(client.Search.WithBody(bytes.NewReader(str)));
    
if err1 != nil{
    return ;
}

解析数据

var resData EsResponse;
err2 := json.NewDecoder(res1.Body).Decode(&resData);
if err2 != nil{
    return ;
}

var esData EsData;
esData.Total = resData.Hits.Total.Value;
    
for _, v := range resData.Hits.Hits {
    cache := v.Source
    cache["_index"] = v.Index;
    cache["_id"] = v.Id;
    cache["_score"] = v.Score;
    esData.List = append(esData.List,cache)
}

修改数据

单条修改

 update := map[string]any{
    "script": map[string]any{
        "source":"ctx._source.user_name='test1';ctx._source.mobile='15211111111';",
        "lang": "painless",
    },
}

str,err1 := json.Marshal(update)
if err1 != nil{
    return ;
}

res2,err2 := client.Update(
    "db.table",
    "1",
    bytes.NewReader(str),
    client.Update.WithRefresh("true")
)

if err2 != nil{
    return ;
}

批量修改

update := map[string]any{
    "query":map[string]any{
        "bool":map[string]any{
            "must":[]map[string]any{
                map[string]any{
                    "match_phrase":map[string]any{
                        "user_name": "test",
                    },
                },
                map[string]any{
                    "match_phrase":map[string]any{
                        "mobile": "15222222222",
                    },
                },
            },
        },
    },
    "script": map[string]any{
        "source":"ctx._source.user_name='test1';ctx._source.mobile='15211111111';",
        "lang": "painless",
    },
}

str,err1 := json.Marshal(update)
if err1 != nil{
    return ;
}

res2,err2 := client.UpdateByQuery(
    []string{
        "db.table",
    },
    client.UpdateByQuery.WithBody(bytes.NewReader(str)),
    client.UpdateByQuery.WithRefresh(true)
)

if err2 != nil{
    return ;
}

删除数据

单条删除

res,err := client.Delete(
    "db.table",
    "1",
    client.Delete.WithRefresh("true")
)
if err != nil{
    return ;
}

批量删除

query := map[string]any{
    "query":map[string]any{
        "bool":map[string]any{
            "must":[]map[string]any{
                map[string]any{
                    "match_phrase":map[string]any{
                        "user_name": "test",
                    },
                },
                map[string]any{
                    "match_phrase":map[string]any{
                        "mobile": "15222222222",
                    },
                },
            },
        },
    },
}

str,err := json.Marshal(query);
if err != nil{
    return ;
}

res,err := client.DeleteByQuery(
    []string{
        "db.table",
    },
    bytes.NewReader(str),
    client.DeleteByQuery.WithRefresh(true)
)

到此这篇关于GO语言操作Elasticsearch示例分享的文章就介绍到这了,更多相关GO语言操作Elasticsearch内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详细介绍Go语言之数组与切片

    详细介绍Go语言之数组与切片

    这篇文章介绍Go语言之数组与切片,数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可是任意的原始类型如整形、字符串或自定义类型。切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制,下面我们就来详细了解一下该内容
    2021-10-10
  • Golang定制化zap日志库使用过程分析

    Golang定制化zap日志库使用过程分析

    Zap是我个人比较喜欢的日志库,是uber开源的,有较好的性能,在项目开发中,经常需要把程序运行过程中各种信息记录下来,有了详细的日志有助于问题排查和功能优化,但如何选择和使用性能好功能强大的日志库,这个就需要我们从多角度考虑
    2023-03-03
  • go语言多线程操作实现

    go语言多线程操作实现

    多线程是一种使程序能够并行处理多个任务的技术,Go语言通过goroutine和channel提供了一种相比传统线程更轻量级、易于管理的并发实现方式,本文就来介绍一下go语言多线程操作实现,感兴趣的可以了解一下
    2024-11-11
  • go语言使用range来接收通道里面的数据

    go语言使用range来接收通道里面的数据

    本文主要介绍了go语言使用range来接收通道里面的数据,for ... range 循环会一直从通道中接收值,直到通道关闭并且所有值都被接收完毕,下面就来介绍一下,感兴趣的可以了解一下
    2025-04-04
  • Golang WorkerPool线程池并发模式示例详解

    Golang WorkerPool线程池并发模式示例详解

    这篇文章主要为大家介绍了Golang WorkerPool线程池并发模式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • golang切片反序实例

    golang切片反序实例

    这篇文章主要介绍了golang切片反序实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang构建HTTP服务的实现步骤

    golang构建HTTP服务的实现步骤

    其实很多框架都是在 最简单的http服务上做扩展的的,基本上都是遵循http协议,本文主要介绍了golang构建HTTP服务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • GO 语言运行环境的基础知识

    GO 语言运行环境的基础知识

    这篇文章主要介绍了GO 语言运行环境的基础知识的相关资料,需要的朋友可以参考下
    2022-09-09
  • 对Golang import 导入包语法详解

    对Golang import 导入包语法详解

    今天小编就为大家分享一篇对Golang import 导入包语法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Go语言中的range用法实例分析

    Go语言中的range用法实例分析

    这篇文章主要介绍了Go语言中的range用法,实例分析了range的功能与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02

最新评论