首页 > 其他分享 >es基础操作,看这篇就够了

es基础操作,看这篇就够了

时间:2024-09-27 09:18:58浏览次数:3  
标签:elastic err fmt 这篇 elasticsearch Println 操作 es

本节课讲解es的基本操作

ElasticSearch 简称es,开源的分布式的全文搜索引擎,可以近乎实时的存储检索数据

es安装

建议大家直接使用docker安装es

拉取镜像

docker pull elasticsearch:7.12.0

创建docker容器挂在的目录:

# linux的命令
mkdir -p /opt/es/config & mkdir -p /opt/es/data & mkdir -p /opt/es/plugins

chmod 777 /opt/es/data

配置文件

echo "http.host: 0.0.0.0" > /opt/es/config/elasticsearch.yml
docker run --name es1 -p 9200:9200  -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms84m -Xmx512m" -d elasticsearch:7.12.0

创建容器

# linux
docker run --name es -p 9200:9200  -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms84m -Xmx512m" -v /opt/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /opt/es/data:/usr/share/elasticsearch/data -v /opt/es/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.12.0

# windows
docker run --name es -p 9200:9200  -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms84m -Xmx512m" -v H:\\docker\\es\\config\\elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v H:\\docker\\es\\data:/usr/share/elasticsearch/data -v H:\\docker\\es\\plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.12.0
# windows添加目录映射,需要在dockerDesktop里面设置映射目录

访问ip:9200能看到东西

就说明安装成功了

浏览器可以下载一个 Multi Elasticsearch Head es插件

或者这个

ElasticHD

Releases · qax-os/ElasticHD · GitHub

连接es

package core

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

func EsConnect() {

  client, err := elastic.NewClient(
    elastic.SetURL("http://127.0.0.1:9200"),
    elastic.SetSniff(false),
    elastic.SetBasicAuth("", ""),
  )
  if err != nil {
    fmt.Println(err)
    return
  }
  global.ESClient = client
}

es认证

不需要认证的情况

  1. 服务器自己使用,9200,9300端口不对外开放
  2. 本身跑在127.0.0.1上

需要认证的情况:

  1. es需要对外提供服务的

给docker创建的elasticsearch容器添加密码_docker elasticsearch 设置密码-CSDN博客

这样就说明成功了

输入用户名和密码就能看到之前的那个页面

或者使用curl进行测试

curl  http://127.0.0.1:9200/
curl -u elastic:xxxxxx http://127.0.0.1:9200/

索引操作

mapping

// 查看某个索引的map
/index/_mapping

常见的类型

{
  "mappings": {
    "properties": {
      "title": { 
        "type": "text" // 查询的时候是分词匹配
      },
      "key": { 
        "type": "keyword" // 完整匹配
      },
      "user_id": {
        "type": "integer"
      },
      "created_at":{
        "type": "date",
        "null_value": "null",
        "format": "[yyyy-MM-dd HH:mm:ss]"
      }
    }
  }
}

创建索引

func CreateIndex() {
  createIndex, err := global.ESClient.
    CreateIndex("user_index").
    BodyString(models.UserModel{}.Mapping()).Do(context.Background())
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(createIndex)
  fmt.Println("索引创建成功")
}

注意:索引存在执行创建索引是会报错的

判断索引是否存在

// ExistsIndex 判断索引是否存在
func ExistsIndex(index string) bool {
  exists, _ := global.ESClient.IndexExists(index).Do(context.Background())
  return exists
}

删除索引

func DeleteIndex(index string) {
  _, err := global.ESClient.
    DeleteIndex(index).Do(context.Background())
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(index, "索引删除成功")
}

文档操作

添加文档

添加单个文档
func DocCreate() {
  user := models.UserModel{
    ID:        12,
    UserName:  "lisi",
    Age:       23,
    NickName:  "夜空中最亮的lisi",
    CreatedAt: time.Now().Format("2006-01-02 15:04:05"),
    Title:     "今天天气很不错",
  }
  indexResponse, err := global.ESClient.Index().Index(user.Index()).BodyJson(user).Do(context.Background())
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Printf("%#v\n", indexResponse)
}

添加文档

如果是mapping里面没有的字段,那么es会自动创建这个字段对应的mapping

批量添加
func DocCreateBatch() {

  list := []models.UserModel{
    {
      ID:        12,
      UserName:  "fengfeng",
      NickName:  "夜空中最亮的枫枫",
      CreatedAt: time.Now().Format("2006-01-02 15:04:05"),
    },
    {
      ID:        13,
      UserName:  "lisa",
      NickName:  "夜空中最亮的丽萨",
      CreatedAt: time.Now().Format("2006-01-02 15:04:05"),
    },
  }

  bulk := global.ESClient.Bulk().Index(models.UserModel{}.Index()).Refresh("true")
  for _, model := range list {
    req := elastic.NewBulkCreateRequest().Doc(model)
    bulk.Add(req)
  }
  res, err := bulk.Do(context.Background())
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(res.Succeeded())
}

删除文档

根据id删除
func DocDelete() {

  deleteResponse, err := global.ESClient.Delete().
    Index(models.UserModel{}.Index()).Id("tmcqfYkBWS69Op6Q4Z0t").Refresh("true").Do(context.Background())
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(deleteResponse)
}

如果文档不存在,会报404的错误

根据id批量删除
func DocDeleteBatch() {
  idList := []string{
    "tGcofYkBWS69Op6QHJ2g",
    "tWcpfYkBWS69Op6Q050w",
  }
  bulk := global.ESClient.Bulk().Index(models.UserModel{}.Index()).Refresh("true")
  for _, s := range idList {
    req := elastic.NewBulkDeleteRequest().Id(s)
    bulk.Add(req)
  }
  res, err := bulk.Do(context.Background())
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(res.Succeeded())  // 实际删除的文档切片
}

如果文档不存在,不会有错误, res.Succeeded() 为空

文档查询

列表查询
func DocFind() {

  limit := 2
  page := 4
  from := (page - 1) * limit

  query := elastic.NewBoolQuery()
  res, err := global.ESClient.Search(models.UserModel{}.Index()).Query(query).From(from).Size(limit).Do(context.Background())
  if err != nil {
    fmt.Println(err)
    return
  }
  count := res.Hits.TotalHits.Value  // 总数
  fmt.Println(count)
  for _, hit := range res.Hits.Hits {
    fmt.Println(string(hit.Source))
  }
}

精确匹配

针对keyword字段

query := elastic.NewTermQuery("user_name", "fengfeng")
模糊匹配

主要是查text,也能查keyword

模糊匹配keyword字段,是需要查完整的

匹配text字段则不用,搜完整的也会搜出很多

query := elastic.NewMatchQuery("nick_name", "夜空中最亮的枫枫")
嵌套字段的搜索
"title": {
    "type": "text",
    "fields": {
        "keyword": {
            "type": "keyword",
            "ignore_above": 256
        }
    }
},

因为title是text类型,只能模糊匹配,但是需要精确匹配的时候,也能通过title.keyword的形式进行精确匹配

query := elastic.NewTermQuery("title.keyword", "这是我的枫枫") // 精确匹配
//query := elastic.NewMatchQuery("title", "这是我的枫枫")  // 模糊匹配

文档更新

func DocUpdate() {
  res, err := global.ESClient.Update().Index(models.UserModel{}.Index()).
    Id("vmdnfYkBWS69Op6QEp2Y").Doc(map[string]any{
    "user_name": "你好枫枫",
  }).Do(context.Background())
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Printf("%#v\n", res)
}

标签:elastic,err,fmt,这篇,elasticsearch,Println,操作,es
From: https://blog.csdn.net/csdngzy/article/details/142584770

相关文章

  • 部署 Nessus 代理扫描
    部署Nessus代理扫描目录部署Nessus代理扫描1环境需求2部署Nessus代理扫描3配置添加扫描器3.1Nessus设置3.2SC设置1环境需求CPU:8core3GhzMemory:16G,8G也可以Storage:100GBOS:RedHatEL7/CentOS7软件:Nessus-10.6.0-es7.x86_64.rpm2部署Nessus......
  • 欧拉系统postgresql 与PostGis 离线环境安装
    postgresql与PostGis离线环境安装上传文件至服务器#安装所需依赖yuminstall/opt/PGsql-13-gis/rpm/*-yPostgresql安装tar-zxvfpostgresql-13.2.tar.gz#进入该目录./configure--prefix=/usr/local/pgsql--with-uuid=ossp--with-libxmlmakemakeinstall#添......
  • 【有啥问啥】大型语言模型的涌现能力(Emergent Abilities):新一代AI的曙光
    大型语言模型的涌现能力(EmergentAbilities):新一代AI的曙光随着人工智能技术的飞速发展,大型语言模型(LargeLanguageModel,LLM)展现出了令人惊叹的涌现能力。这种能力并非模型规模简单线性增长的结果,而是在模型达到一定复杂度后,突然涌现出的一系列复杂能力,如深层语义理解、逻......
  • python 实现gradient boosting regressor梯度增强回归器算法
    gradientboostingregressor梯度增强回归器算法介绍梯度增强回归器(GradientBoostingRegressor,简称GBR)是一种集成学习算法,专门用于解决回归问题。它通过组合多个弱学习器(通常是决策树)来构建一个强大的预测模型。以下是关于梯度增强回归器算法的详细解释:原理梯度增强回......
  • GAMES101(作业7)
     作业七题目:实现pathTracing,仅修改castRay(constRayray,intdepth)函数,在其中实现PathTracing算法代码框架://OBJ-loader模型加载库 global:全局变量/函数 vector:Vector3f,Vector2f类floatnorm(){returnstd::sqrt(x*x+y*y+z*z);}/*向量长度......
  • 易优CMS【错误代码】 SQLSTATE【42S02】:Base table or view not found:1146 Table‘111
    当你遇到“数据表或视图不存在”的错误提示时,通常是因为数据库中缺少某个表或视图。以下是一些具体的解决步骤:步骤1:确认表是否存在检查数据库表使用数据库管理工具(如phpMyAdmin)打开数据库。检查数据库中是否存在表 ey_admin_theme。如果表不存在,需要创建该表。步骤......
  • 828华为云征文|Flexus云服务器X实例实践:安装flatnotes笔记应用程序
    828华为云征文|Flexus云服务器X实例实践:安装letsmarkdown轻量级编辑器引言一、Flexus云服务器X实例介绍1.1Flexus云服务器X实例简介1.2主要使用场景二、购买Flexus云服务器X实例2.1购买规格参考2.2查看Flexus云服务器X实例状态三、远程连接Flexus云服务器X实例3.1......
  • SQL sever 数据库与表的建立#基础操作
    一:创建数据库利用SQLServerManagementStudio创建数据库,名称为“学生选课”打开sqlsever进行如下操作二:创建表在学生选课数据库中建立学生表Ctrl+s(保存)保存后,进行刷新就可看到学生表。三:数据的录入与修改随机输入下面的数据。查询数据新建查询,输入以上代......
  • 易优CMS出现:Allowed memory size of 134217728 bytes exhausted (tried to allocate 2
    当你遇到“Allowedmemorysizeof134217728bytesexhausted(triedtoallocate20480bytes)”的错误时,这意味着PHP的内存限制已经耗尽。这种错误通常发生在处理大量数据或执行复杂计算时。为了解决这个问题,可以采取以下几种方法:方法1:修改 php.ini 文件(推荐)找到 php......
  • 易优CMS登录后台报Allowed memory size of 134217728 bytes ex hausted (tried to alo
    当你在登录后台时遇到“Allowedmemorysizeof134217728bytesexhausted(triedtoallocate20480bytes)”的错误提示时,通常是由于PHP的内存限制不足导致的。以下是一些具体的解决步骤:步骤1:检查PHP配置登录宝塔面板登录宝塔面板。在左侧菜单栏选择“软件商店”。......