首页 > 其他分享 >GO语言操作Elasticsearch

GO语言操作Elasticsearch

时间:2023-01-16 18:31:39浏览次数:40  
标签:map return 语言 json client Elasticsearch GO any string

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)
)

标签:map,return,语言,json,client,Elasticsearch,GO,any,string
From: https://blog.51cto.com/lzcit/6010742

相关文章

  • C语言最短路径[迪杰斯特拉算法][2023-01-16]
    C语言最短路径[迪杰斯特拉算法][2023-01-16]算法与数据结构课程设计要求一、 题目:最短路径二、课程设计报告要求1、设计目的(1)要求熟练掌握C语言的基本知识和编程技......
  • go之toml包实战
    go的toml包使用案例toml包【github.com/BurntSushi/toml】作用是将配置文件解析到结构体中,本文带你如何实现1、toml文件#是key=value书写类型[Mysql]UserName="t......
  • golang 结构体
    结构体与JSON序列化JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON键值对是用来保存JS对象的一......
  • django获取多对多关系表中字段返回以及序列化器中传参解决方案
    djangohowcanimakeaserializerwithrelationtablefieldhttps://stackoverflow.com/questions/53137077/django-rest-framework-serializer-with-field-from-rela......
  • (转)Golang中自动“取引用”和“解引用”对原值的影响
    原文:https://blog.csdn.net/u014633283/article/details/839020201.写在前面我们知道Golang在调用方法时,会自动对实参进行“取引用”或“解引用”操作。我们在前面的博客......
  • C语言电话号码查询系统[2023-01-16]
    C语言电话号码查询系统[2023-01-16]一、课程设计(论文)题目电话号码查询系统说明:设计哈希表,实现电话号码查询系统。二、本次课程设计(论文)应达到的目的C语言、面向对象......
  • C语言格式字符的意义
    格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。不同类型的数据用不同的格式字符。格式字符有d,o,x,u......
  • elasticsearch 安装与配置
    一、JAVA与elasticsearch的版本对应个人实测能够对应起来的版本:elasticsearch-rtf-2.2.1需要JDK7或更低的版本,推荐使用7elasticsearch-rtf-2.3.3个人测试可以使......
  • golang map的定义与使用
    Mapmap是一堆键值对的未排序集合,比如以身份证号作为唯一键来标识一个人的信息。map是引用类型,键必须支持相等运算符(==,!=)类型,比如:int,string,float等内建类型,只含......
  • C语言家庭日常消费记录管理系统
    C语言家庭日常消费记录管理系统题目:家庭日常消费记录管理系统一、功能需求说明(必须采用动态链表实现)1.消费记录存在文件fee.dat中格式如下:每一条记录包括一个消费......