玩转Elasticsearch—Go整合ES7.16.2

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 玩转Elasticsearch—Go整合ES7.16.2

下载依赖:

go get -u github.com/olivere/elastic/v7

在这里插入图片描述
Init.go

package main

import (
   "context"
   "fmt"
   "github.com/olivere/elastic/v7"
   "log"
)

var ctx = context.Background()
var Url = "http://127.0.0.1:9200"
var esClient *elastic.Client

var index = "student"

//结构体
type Student struct {
   Id      int    `json:"id"`
   Name    string `json:"name"`
   Age     int    `json:"age"`
   Address string `json:"address"`
}

// 定义一些变量,mapping为定制的index字段类型
// number_of_replicas备份数 , number_of_shards分片数
const mapping = `
{
   "settings":{
      "number_of_shards": 1,
      "number_of_replicas": 0 
   },
   "mappings":{
         "properties":{
            "name":{
               "type":"keyword"
            },
            "address":{
               "type":"text"
            },
            "age":{
               "type":"long"
            },
            "id":{
               "type":"long"
            }
         }
   }
}`

// 初始化es连接
func init() {
   client, err := elastic.NewClient(
      elastic.SetURL(Url),
   )
   if err != nil {
      log.Fatal("es 连接失败:", err)
   }
   // ping通服务端,并获得服务端的es版本,本实例的es版本为version 7.16.2
   info, code, err := client.Ping(Url).Do(ctx)
   if err != nil {
      panic(err)
   }
   fmt.Println("Elasticsearch call code:", code, " version:", info.Version.Number)
   esClient = client
   // fmt.Println("es连接成功")
}

Add.go

package main

import (
   "fmt"
   "log"
)

//添加数据
func AddDoc(index string, data interface{}) (bool, error) {
   // 添加索引
   _, err := addIndex(index)
   if err != nil {
      log.Fatal("创建索引失败", err)
   }
   // 添加doc 先获取index再为index添加index
   res, err := esClient.Index().
      Index(index).
      BodyJson(data).
      Do(ctx)
   if err != nil {
      return false, err
   }
   fmt.Println("添加数据成功:", res)
   return true, nil
}

//添加数据 指定id
func AddDocById(id string, index string, data interface{}) (bool, error) {
   // 添加索引
   _, err := addIndex(index)
   if err != nil {
      log.Fatal("创建索引失败", err)
   }
   // 添加doc 先获取index再为index添加index
   res, err := esClient.Index().
      Index(index).
      BodyJson(data).
      Id(id).
      Do(ctx)
   if err != nil {
      return false, err
   }
   fmt.Println("添加数据成功:", res)
   return true, nil
}

// 添加索引
// 并在7.x后强制要求只能有一个类型,就是 _doc  ---> /{index}/_doc/{id}
func addIndex(index string) (bool, error) {
   // 创建index前,先查看es引擎中是否存在自己想要创建的索引index
   exists, err := esClient.IndexExists(index).Do(ctx)
   if err != nil {
      fmt.Println("存在索引:", err)
      return true, nil
   }
   if !exists {
      // 如果不存在,就创建  BodyString将索引的配置指定为字符串。
      createIndex, err := esClient.CreateIndex(index).BodyString(mapping).Do(ctx)
      if err != nil {
         return false, err
      }
      if !createIndex.Acknowledged {
         return false, err
      }
   }
   return true, nil
}

select.go

package main

import (
   "encoding/json"
   "fmt"
   "github.com/olivere/elastic/v7"
   "strings"
)

// 查询数据
func query(index string, field string, filter elastic.Query, sort string, page int, limit int) (*elastic.SearchResult, error) {
   // 分页数据处理
   isAsc := true
   if sort != "" {
      sortSlice := strings.Split(sort, " ")
      sort = sortSlice[0]
      if sortSlice[1] == "desc" {
         isAsc = false
      }
   }
   // 查询位置处理
   if page <= 1 {
      page = 1
   }

   fsc := elastic.NewFetchSourceContext(true)
   // 返回字段处理
   if field != "" {
      fieldSlice := strings.Split(field, ",")
      if len(fieldSlice) > 0 {
         for _, v := range fieldSlice {
            fsc.Include(v)
         }
      }
   }

   // 开始查询位置
   fromStart := (page - 1) * limit
   res, err := esClient.Search().
      Index(index).
      FetchSourceContext(fsc).
      Query(filter).
      Sort(sort, isAsc).
      From(fromStart).
      Size(limit).
      Pretty(true).
      Do(ctx)
   if err != nil {
      return nil, err
   }
   return res, nil

}

//index:"index"      索引
//field:"name,age"   要查询的字段
//filter:*TermQuery  查询规则
//sort:"age asc"     排序规则
//page:0             页数
//limit:10           条目数量
func QueryDoc(index string, field string, filter elastic.Query, sort string, page int, limit int) (interface{}, error) {
   res, err := query(index, field, filter, sort, page, limit)
   strD, _ := json.Marshal(res)
   if err != nil {
      fmt.Println("失败:", err)
      return nil, nil
   }
   fmt.Println("执行完成")
   return string(strD), nil
}

Update.go

package main

import (
   "errors"
   "fmt"
   "github.com/olivere/elastic/v7"
)

// 条件更新文档
func UpdateDoc(index string, filter elastic.Query, data map[string]interface{}) (bool, error) {
   // 修改数据组装
   if len(data) < 0 {
      return false, errors.New("修改参数不正确")
   }
   scriptStr := ""
   for k := range data {
      scriptStr += "ctx._source." + k + " = params." + k + ";"
   }
   script := elastic.NewScript(scriptStr).Params(data)
   res, err := esClient.UpdateByQuery(index).
      Query(filter).
      Script(script).
      Do(ctx)
   if err != nil {
      return false, err
   }
   fmt.Println("添加数据成功:", res)
   return true, nil
}

delete.go

package main

import (
   "fmt"
   "github.com/olivere/elastic/v7"
)

// 删除文档
func DeleteDoc(index string, filter elastic.Query) (bool, error) {
   res, err := esClient.DeleteByQuery().
      Query(filter).
      Index(index).
      Do(ctx)
   if err != nil {
      return false, err
   }
   fmt.Println("删除信息:", res)
   return true, nil
}

Main.go

package main

import (
   "fmt"
   "github.com/olivere/elastic/v7"
)

func main() {
   //deleteDoc()
   //add()
   //update()
}

func add() {
   stu := Student{
      Id:      2,
      Address: "北京",
      Name:    "小红",
      Age:     10,
   }
   //res, err := AddDoc(index, stu)
   res, err := AddDocById("2", index, stu)
   fmt.Println(res)
   fmt.Println(err)
}

func selectDoc() {
   index_ := index
   sort := "age asc"
   page := 0
   limit := 10
   field := "id,name,age,address"
   filter := elastic.NewTermQuery("name", "名称")
   res, err := QueryDoc(index_, field, filter, sort, page, limit)
   fmt.Println(res)
   fmt.Println(err)
}

func deleteDoc() {
   query := elastic.NewTermQuery("name", "小明")
   DeleteDoc(index, query)
}

func update() {
   index_ := index
   filter := elastic.NewTermQuery("name", "小明")
   data := make(map[string]interface{})
   data["address"] = "上海"
   data["age"] = 120
   res, err := UpdateDoc(index_, filter, data)
   if err != nil {
      fmt.Println("失败:", err)
   } else {
      fmt.Println("成功:", res)
   }
}
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
8天前
|
存储 JSON Go
ElasticSearch的HTTP操作 和Go客户端
【2月更文挑战第13天】ElasticSearch的HTTP操作 和Go客户端操作
50 0
|
关系型数据库 MySQL Go
使用go-mysql-elasticsearch同步mysql数据库信息到ElasticSearch
本文介绍如何使用go-mysql-elasticsearch同步mysql数据库信息到ElasticSearch。1.go-mysql-elasticsearch简介go-mysql-elasticsearch是一个将MySQL数据自动同步到Elasticsearch的服务。
4186 0
|
存储 消息中间件 监控
(20)go-micro微服务Elasticsearch使用
(20)go-micro微服务Elasticsearch使用
112 0
Go --- go-elasticsearch介绍及简单使用
Go --- go-elasticsearch介绍及简单使用
Go --- go-elasticsearch介绍及简单使用
|
JSON 搜索推荐 Go
Go项目优化——使用Elasticsearch搜索引擎
Go项目优化——使用Elasticsearch搜索引擎
117 0
Go项目优化——使用Elasticsearch搜索引擎
玩转Elasticsearch—Go整合ES7.16.2
玩转Elasticsearch—Go整合ES7.16.2
|
Go 索引
Go一分钟对接ElasticSearch实践
今天这篇分享:使用Go语言对接ElasticSearch实践。
369 0
|
数据可视化 关系型数据库 MySQL
go-mysql-elasticsearch实现mysql 与elasticsearch实时同步深入详解
引言: go-mysql-elasticsearch 是国内作者开发的一款插件。测试表明:该插件优点:能实现同步增、删、改、查操作。不足之处(待完善的地方): 1、仍处理开发、相对不稳定阶段; 2、没有日志,不便于排查问题及查看同步结果。 本文深入详解了插件的安装、使用、增删改查同步测试。
353 0
|
MySQL 测试技术 关系型数据库
go-mysql-elasticsearch实现mysql 与elasticsearch实时同步深入详解
本文深入详解了插件的安装、使用、增删改查同步测试。
908 0
|
8天前
|
Java Maven 开发工具
【ElasticSearch 】IK 分词器安装
【ElasticSearch 】IK 分词器安装
27 1