GO语言操作Elasticsearch

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch简介与实战

elasticsearch和kibana的安装

Elasticsearch详解与安装

Elasticsearch:运用 Go 语言实现 Elasticsearch 搜索 - 8.x

Elasticsearch:运用 Go 语言实现 Elasticsearch 搜索 - 8.x

go操作ElasticSearch7.3.2