Elasticsearch入门学习

news2025/1/15 8:01:32

Elasticsearch是什么

Elasticsearch 是一个基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展的数据存储和矢量数据库。 它针对生产规模工作负载的速度和相关性进行了优化。 使用 Elasticsearch 近乎实时地搜索、索引、存储和分析各种形状和大小的数据。

特点

  1. 分布式:Elasticsearch 设计为在多台服务器上运行,可以处理大量数据和高并发请求。

  2. 高可扩展性:可以轻松地通过增加更多的节点来扩展集群,以提高搜索和索引的性能。

  3. 实时搜索:Elasticsearch 能够提供接近实时的搜索体验,这意味着在索引数据后,可以立即搜索到这些数据。

  4. 多租户:支持多租户架构,允许多个用户或应用程序共享同一个 Elasticsearch 集群。

  5. RESTful API:Elasticsearch 提供了一个基于 REST 的 API,使得与搜索引擎的交互变得简单,可以通过 HTTP 请求来索引、搜索、更新和删除数据。

  6. JSON 文档:Elasticsearch 使用 JSON 格式来存储和索引数据,这使得它易于与其他使用 JSON 的应用程序集成。

  7. 分析和聚合:Elasticsearch 提供了强大的分析和聚合功能,可以对数据进行复杂的分析,如计算平均值、总和、计数等。

  8. 索引和搜索功能:Elasticsearch 提供了丰富的索引和搜索功能,包括全文搜索、精确匹配、范围查询、模糊搜索等。

  9. 监控和日志:Elasticsearch 通常与其他 Elastic Stack 产品(如 Logstash 和 Kibana)一起使用,用于监控、日志记录和可视化数据。

  10. 安全性:Elasticsearch 提供了安全特性,如用户认证、授权和加密,以保护数据和集群的安全。

Elasticsearch 广泛应用于日志分析、全文搜索、安全情报、业务分析等领域。它的灵活性和可扩展性使其成为处理大规模搜索和分析任务的理想选择。

Elasticsearch核心概念

1、Cluster:集群

Elasticsearch可以作为一个独立的单个搜索服务器,不过,为了处理大型数据集,实现容错和高可用性,Elasticsearch可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。

2、Node:节点

形成集群的每个服务器称为节点。

3、Shard:分片

当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片。每个分片放到不同的服务器上。 当你查询的索引分布在多个分片上时,Elasticsearch会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的。

4、Replia:副本

为提高查询吞吐量或实现高可用性,可以使用分片副本。 副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。 当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。

索引结构

下图是索引结构,下边黑色部分是物理结构,上边蓝色部分是逻辑结构,逻辑结构也是为了更好的去描述工作原理及去使用物理结构中的索引文件。

Elasticsearch工作原理

当Elasticsearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。

Elasticsearch数据架构的主要概念(与关系数据库Mysql对比)

安装

  1. 前提条件:需要jdk,超详细JDK下载与安装步骤(保姆级,含安装包)
  2. 要想安装 Elasticsearch,先下载并解压适合你操作系统的 Elasticsearch 版本: Elasticsearch官网

例如:windows下载

        3. 解压之后进入bin目录下,双击执行elasticsearch.bat

        4.看到started说明启动成功,打开浏览器访问:http://localhost:9200/

页面化工具Kibana安装

Kibana官网:Kibana 的版本需要和 Elasticsearch 的版本一致

安装前提

ElasticSearch安装

Node.js安装:Windows下安装及配置Node.js

下载安装

在 Windows 中安装 Kibana 使用 .zip 包

配置

在编辑器中打开config / kibana.yml

设置elasticsearch.url为指向您的Elasticsearch实例

默认值: "http://localhost:9200" 用来处理所有查询的 Elasticsearch 实例的 URL

运行

双击 bin\kibana.bat,浏览器访问:http://localhost:5601/

使用示例

1连接

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
}

2mapping映射

{
  "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]"
      }
    }
  }
}

3创建索引

1. 判断索引是否存在,如果存在,删除索引

2. 创建索引

func CreateIndex() {
	index := "user_index"
	if ExistsIndex(index) {
		// 索引存在,先删除,在创建
		DeleteIndex(index)
	}

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

// 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, "索引删除成功")
}

4批量添加/删除

//批量添加
func DocCreateBatch() {

  list := []models.UserModel{
    {
      ID:        12,
      UserName:  "zs",
      NickName:  "张三",
      CreatedAt: time.Now().Format("2006-01-02 15:04:05"),
    },
    {
      ID:        13,
      UserName:  "ls",
      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())
}

//批量删除
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())  // 实际删除的文档切片
}

5文档查询

// 1、列表查询
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))
  }
}

// 2、精准查询
query := elastic.NewTermQuery("user_name", "zs")

// 3、模糊查询
query := elastic.NewMatchQuery("nick_name", "张三")

// 4、嵌套字段查询
"title": {
    "type": "text",
    "fields": {
        "keyword": {
            "type": "keyword",
            "ignore_above": 256
        }
    }
},
//因为title是text类型,只能模糊匹配,但是需要精确匹配的时候,也能通过title.keyword的形式进行精确匹配

query := elastic.NewTermQuery("title.keyword", "王五") // 精确匹配
query := elastic.NewMatchQuery("title", "王五")  // 模糊匹配

6文档更新

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2276896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[读书日志]8051软核处理器设计实战(基于FPGA)第七篇:8051软核处理器的测试(verilog+C)

6. 8051软核处理器的验证和使用 为了充分测试8051的性能,我们需要测试每一条指令。在HELLO文件夹中存放了整个测试的C语言工程文件。主函数存放在指令被分为五大类,和上面一样。 打开后是这样的文件结构。HELLO.c是主文件,这是里面的代码&am…

【Vue实战】Vuex 和 Axios 拦截器设置全局 Loading

目录 1. 效果图 2. 思路分析 2.1 实现思路 2.2 可能存在的问题 2.2.1 并发请求管理 2.2.2 请求快速响应和缓存带来的问题 3. 代码实现 4. 总结 1. 效果图 如下图所示,当路由变化或发起请求时,出现 Loading 等待效果,此时页面不可见。…

一文读懂yolo11模型训练

一文读懂yolo11模型训练 一、环境准备 Anaconda安装 简介 Anaconda 是一个流行的开源 Python 发行版,专注于数据科学、机器学习、科学计算和分析等领域。它提供了一个强大的包管理器和环境管理器,名为 Conda,以及一个预装了大量科学计算和…

Apache PAIMON 学习

参考:Apache PAIMON:实时数据湖技术框架及其实践 数据湖不仅仅是一个存储不同类数据的技术手段,更是提高数据分析效率、支持数据驱动决策、加速AI发展的基础设施。 新一代实时数据湖技术,Apache PAIMON兼容Apache Flink、Spark等…

音视频入门基础:RTP专题(1)——RTP官方文档下载

一、引言 实时传输协议(Real-time Transport Protocol,简写RTP)是一个网络传输协议,由IETF的多媒体传输工作小组1996年在《RFC 1889》中公布的。 RTP作为因特网标准在《RFC 3550》有详细说明。而《RFC 3551》详细描述了使用最小…

【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象

文章目录 Section 7:Text Objects and MacrosS07L28 Text Objects1 文本对象的含义2 操作文本对象的基本语法3 操作光标所在的整个单词4 删除光标所在的整个句子5 操作光标所在的整个段落6 删除光标所在的中括号内的文本7 删除光标所在的小括号内的文本8 操作尖括号…

LiveGBS流媒体平台GB/T28181常见问题-没有收到视频流播放时候提示none rtp data receive未收到摄像头推流如何处理?

LiveGBS没有收到视频流播放时候提示none rtp data receive未收到摄像头推流如何处理? 1、none rtp data receive2、搭建GB28181视频直播平台 1、none rtp data receive LiveSMS 收不到下级推流 首先需要排查服务器端 UDP & TCP 30000-30249 端口是否开放其次排…

使用Docker模拟PX4固件的无人机用于辅助地面站开发

前言 最近在制作鸿蒙无人机地面站,模仿的是QGroundControl,协议使用mavlink,记录一下本地模拟mavlink协议通过tcp/udp发送 废话不多说直接上命令 1.启动docker的桌面端 启动之后才能使用docker命令来创建容器 docker run --rm -it jonas…

【Docker】保姆级 docker 容器部署 MySQL 及 Navicat 远程连接

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. docker 容器部署 MySQL1.1 拉取mysql镜像1.2 启动容器1.3 进入容器1.4 使用 root 用户登录 2. Navicat 连…

【大数据】机器学习-----线性模型

一、线性模型基本形式 线性模型旨在通过线性组合输入特征来预测输出。其一般形式为: 其中: x ( x 1 , x 2 , ⋯ , x d ) \mathbf{x}(x_1,x_2,\cdots,x_d) x(x1​,x2​,⋯,xd​) 是输入特征向量,包含 d d d 个特征。 w ( w 1 , w 2 , ⋯ ,…

装备制造行业(复杂机械制造)数字化顶层规划 - 汇报会

行业业务特点: 尊敬的各位管理层: 大家好!今天我将向大家汇报装备制造企业数字化战略的顶层规划设计。在当今数字化浪潮下,装备制造企业面临着转型升级的迫切需求,数字化战略的制定与实施对于提升企业竞争力、实现可持…

深度探索C++20协程机制

#include <iostream> #include <coroutine>class CoroTaskSub { public://编译器在处理协程函数时是通过其返回类型【即协程接口类型】&#xff0c;确定协程的承诺类型和协程句柄类型struct promise_type;using CoroHdl std::coroutine_handle<promise_type>…

linux手动安装mysql5.7

一、下载mysql5.7 1、可以去官方网站下载mysql-5.7.24-linux-glibc2.12-x86_64.tar压缩包&#xff1a; https://downloads.mysql.com/archives/community/ 2、在线下载&#xff0c;使用wget命令&#xff0c;直接从官网下载到linux服务器上 wget https://downloads.mysql.co…

Java Stream实现【Int / Long / Double / Bigdecimal】累计求和

文章目录 背景实现方案案例素材Int类型求和Long 类型求和Double 类型求和BigDecimal 类型求和 背景 在项目开发中经常会使用到数据统计&#xff0c;Java中有求和的方法&#xff0c;可使用Java的Stream工作流实现&#xff0c;记录下来&#xff0c;方便备查。 实现方案 可使用…

OFD文件纯前端查看解决方案

文章目录 ofd.js原有bug修复1、ofd格式文档打开报错2、签章信息不显示 效果展示源码下载 使用前请查看免责声明 ofd.js原有bug修复 1、ofd格式文档打开报错 原因分析&#xff1a; 文档打开时会解析所用到的字体信息&#xff0c;如果字体不在ofd.js预设字体时&#xff0c;会触…

使用 Docker 部署 Java 项目(通俗易懂)

目录 1、下载与配置 Docker 1.1 docker下载&#xff08;这里使用的是Ubuntu&#xff0c;Centos命令可能有不同&#xff09; 1.2 配置 Docker 代理对象 2、打包当前 Java 项目 3、进行编写 DockerFile&#xff0c;并将对应文件传输到 Linux 中 3.1 编写 dockerfile 文件 …

二手车交易系统的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统二手车交易信息管理难度大&#xff0c;容错率低&#xf…

抖音ip属地没有手机卡会显示吗

在数字时代&#xff0c;社交媒体平台如抖音已成为人们日常生活的重要组成部分。随着抖音等应用对用户体验和隐私保护的不断优化&#xff0c;IP属地显示功能逐渐走进大众视野。这一功能旨在提高网络环境的透明度&#xff0c;打击虚假信息和恶意行为。然而&#xff0c;对于没有手…

springMVC---resultful风格

目录 一、创建项目 pom.xml 二、配置文件 1.web.xml 2.spring-mvc.xml 三、图解 四、controller 一、创建项目 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi…

[Git] 深入理解 Git 的客户端与服务器角色

Git 的一个核心设计理念是 分布式&#xff0c;每个 Git 仓库都可以既是 客户端&#xff0c;也可以是 服务器。为了更好地理解这一特性&#xff0c;我们通过一个实际的 GitHub 远程仓库和本地仓库的场景来详细说明 Git 如何在客户端和服务器之间协作&#xff0c;如何独立地进行版…