Elasticsearch:基础概念

这里写目录标题

  • 一、什么是Elasticsearch
    • 1、基础介绍
    • 2、什么是全文检索
    • 3、倒排索引
    • 4、索引
      • (1)创建索引
        • a 创建索引基本语法
        • b 只定义索引名,setting、mapping取默认值
        • c 创建一个名为student_index的索引,并设置一些自定义字段
      • (2)删除索引
      • (3)查询索引
      • (4)修改索引
        • a 动态更新索引的settings部分
        • b 动态更新索引的部分mapping字段信息
        • c 向student_index 添加一个名为grade的新字段,类型为Integer,并将副本数量更新为2.
    • 5、映射
    • 6、文档基本操作
      • (1)新增文档
        • a 新增单个文档
        • b 批量新增文档
      • (2)查询文档
      • (3)删除文档
      • (4)更新文档
    • 7、索引别名
      • (1)为什么需要别名
      • (2)如何为索引添加别名
      • (3)多索引检索的实现方案
        • a 不适用别名的方案
        • b 使用别名的方案
        • c 思考:使用别名和基于索引的检索效率是一样的吗?
  • 二、分片
  • 三、副本(Replicas)
  • 四、分配Allocation
  • 五、系统架构
  • 六、故障转移
  • 七、水平扩容

一、什么是Elasticsearch

1、基础介绍

Elasticsearch是基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展数据存储和矢量数据库。它针对生产规模工作负载的速度和相关性进行了优化。使用 Elasticsearch 可以近乎实时地搜索、索引、存储和分析各种形状和大小的数据。Elasticsearch 是Elastic Stack的核心。它与Kibana相结合,为以下 Elastic 解决方案提供支持:

  • 可观察性

    • 日志、指标和跟踪:收集、存储和分析来自应用程序、系统和服务的日志、指标和跟踪。
    • 应用程序性能监控 (APM):监控和分析业务关键型软件应用程序的性能。
    • 真实用户监控 (RUM):监控、量化和分析用户与 Web 应用程序的交互。
    • OpenTelemetry:重复使用您现有的仪器,使用 OpenTelemetry 标准将遥测数据发送到 Elastic Stack。
  • 搜索加粗样式

    • 全文搜索:使用倒排索引、标记化和文本分析构建快速、相关的全文搜索解决方案。
    • 向量数据库:存储和搜索向量化数据,并使用内置和第三方自然语言处理 (NLP) 模型创建向量嵌入。
    • 语义搜索:使用同义词、密集向量嵌入和学习到的稀疏查询文档扩展等工具了解搜索查询背后的意图和上下文含义。
    • 混合搜索:使用最先进的排名算法将全文搜索与向量搜索相结合。
    • 构建搜索体验:向应用程序或网站添加混合搜索功能,或在组织的内部数据源上构建企业搜索引擎。
    • 检索增强生成 (RAG):使用 Elasticsearch 作为检索引擎,为一系列用例提供更相关、最新或专有的数据来补充生成式 AI 模型。
    • 地理空间搜索:使用地理空间查询搜索位置并计算空间关系。
  • 安全

    • 安全信息和事件管理 (SIEM):收集、存储和分析来自应用程序、系统和服务的安全数据。
    • 端点安全:监控和分析端点安全数据。
    • 威胁搜寻:搜索和分析数据以检测和应对安全威胁。

2、什么是全文检索

全文检索(Full-Text Search)是一种从大量文本数据中快速检索出包含指定词汇或短语的信息的技术。

3、倒排索引

倒排索引实现方式:

  • 文档预处理。
  • 构建词典。
  • 创建倒排列表。
  • 存储索引文件。
  • 查询处理。

4、索引

类似mysql中的表。

(1)创建索引

a 创建索引基本语法

PUT /index_name

{"settings": {// 索引设置},"mappings": {"propertis": {// 字段映射}}
}

必要的参数

  • 索引名称
    索引名称必须是小写字母,可以包含数字和下划线。
  • 索引设置(settings)
    • 分片数量(number of shards) :一个索引的分片数决定了索引的并行度和数据分布。
      示例:“number_of_shards”:1

    • 副本数量(number of replicas):副本提高了数据的可用性和容错能力。
      示例:“number_of_replicas”:1

  • 映射(mapping)
    字段属性(properties)定义索引中文档的字段及其类型。常用字段类型包括:text, keyword,Integer,float,date等。
b 只定义索引名,setting、mapping取默认值
c 创建一个名为student_index的索引,并设置一些自定义字段
{"settings": {"number_of_shards": 1,"number_of_replicas": 1},"mappings": {"properties": {"name": {"type": "text"},"age": {"type": "integer"},"enrolled_date": {"type": "date"}}}
}

(2)删除索引

删除索引会删除该索引下的所有文档和相关的元数据。
删除索引的基本语法如下:
DELETE /index_name

(3)查询索引

GET / index_name

(4)修改索引

a 动态更新索引的settings部分

PUT /index_name/_settings

{"index": {"setting_name": "setting_value"}
}
b 动态更新索引的部分mapping字段信息

PUT /index_name/_mapping

{"properties": {"new_field": {"type": "field_type"}}
}
c 向student_index 添加一个名为grade的新字段,类型为Integer,并将副本数量更新为2.

5、映射

6、文档基本操作

类似mysql表中的一行记录。

(1)新增文档

a 新增单个文档

在ES8.x中,新增文档的操作可以通过POST或PUT请求完成,具体取决于是否指定了文档的唯一性标识(即ID)。如果在创建数据时指定了唯一性标识,可以使用POST或PUT请求;如果没有指定唯一性标识,只能使用POST请求。

使用POST请求新增文档:
当不指定文档ID时,可以使用POST请求来新增文档,Elasticsearch会自动生成一个唯一ID。语法如下:
POST /index_name/_doc

{"field1":"value1","field2":"value2"
}

使用PUT请求新增文档:
当指定了文档的唯一标识(ID)时,可以使用PUT请求来新增或更新文档。如果指定额ID在索引中不存在,则会创建一个新文档;如果已经存在,则会替换现有文档,语法如下:
PUT /index_name/document_id

{"field1":"value1","field2":"value2"
}

在Elasticsearch8.x中,PUT和POST请求在新增文档的行为有所不同,主要体现在以下几个方面:

  • 指定文档ID

    • PUT请求在创建或更新文档时必须指定文档的唯一ID。如果指定的ID已经存在,PUT请求会替换现有的文档;如果不存在,则创建一个新文档。
    • POST请求在创建新文档时可以指定ID,也可以不指定。如果不指定ID,Elasticsearch会自动生成一个唯一的ID。
  • 幂等性

    • PUT请求是幂等的,这意味着多次执行相同的PUT请求,即使是针对同一个文档,最终的结果都是一致的。
    • POST请求不是幂等的,多次执行相同的POST请求可能会导致创建多个文档。
  • 更新行为

    • PUT请求在更新文档时会替换整个文档的内容,即使是文档中未更改的部分也会被新内容覆盖。
    • POST请求在更新文档时可以使用_update API,这样可以只更新文档中特定字段,而不是替换整个文档。
b 批量新增文档

批量新增文档可以减少网络连接所产生的开销,提升性能:

  • 支持一次API调用中,对不同的索引进行操作。
  • 操作中单条操作失败,并不会影响其他操作。
  • 返回结果包括每一条操作执行的结果。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(2)查询文档

(3)删除文档

(4)更新文档

在Elasticsearch8.x版本中,更新操作通常通过_update接口执行,该接口允许您部分更新现有文档的字段。以下更新文档的基本语法:
POST /index_name/_update/{id}

{"doc": {"field": "<value>"}
}

在Elasticsearch8.x中,更新多个文档可以通过两种主要方法实现:

  • 使用_bulk API
    POST /_bulk
{"update": {"_index": "<index_name>","_id": "<document_id>"},"doc": {"field1": "new_value1","field2": "new_value2"},"upsert": {"field1": "new_value1","field2": "new_value2"}
}

在这个请求中,每个update块代表一个更新操作,其中index和id指定了要更新的文档,doc部分包含了更新后的文档内容,upsert部分定义了如果文档不存在时应该插入的内容。

  • 使用_update_by_query API,_update_by_query API允许您根据查询条件更新多个文档。这个操作是原子性的,意味着要么所有匹配的文档都被更新,要么一个都不会被更新。
    POST /<index_name>/_update_by_query
{"query": {// 定义更新文档的查询条件},"script": {"source": "ctx._source.field = 'new_value'","lang": "painless"}
}

在这个请求中,<index_name>是您要更新的索引名称,query部分定义了哪些文档需要被更新,script部分定义了如何更新这些文档的字段。

并发场景下如何保证线程安全
在Elasticsearch7.x及以后得版本中,_seq_no和_primary_term取代了旧版本的_version字段,用于控制文档的版本。seqno代表文档在特定分片的序列号,而_primary_term代表文档所在主分片的任期编号。这两个字段共同构成了文档的唯一版本标识符,用于实现乐观锁机制,确保在高并发环境下文档的一致性和正确更新。
当在高并发环境下使用乐观锁机制修改文档时,要带上当前文档_seq_no和_primary_term进行更新:
POST /employee/_doc/1?if_seq_no=13&if_primary_term=1

{"name": "张三","sex": "1","age": "25"
}

如果_seq_no和_primary_term不对,会抛出版本冲突异常。

7、索引别名

(1)为什么需要别名

索引别名可以指向一个或多个索引,并且可以在任何需要索引名称的API中使用。别名提供了极大的灵活性,它允许用户执行以下操作:

  • 在正在运行的集群上的一个索引和另一个索引之间进行透明切换。
  • 对多个对象进行分组组合。
  • 在索引中的文档子集上创建视图,结合业务场景,缩小检查范围,自然会提升检索效率。

(2)如何为索引添加别名

  • 创建索引的时候可以指定别名

  • 为已有索引添加别名:要为现有的索引添加别名,可以使用_aliases API:
    POST /_aliases

{"actions": [{"add": {"index": "index_name","alias": "alias_name"}}]
}

(3)多索引检索的实现方案

a 不适用别名的方案
  • 方式一:使用逗号对多个索引名称进行分割
    POST index1,index2,index3,index4/_search

  • 方式二:使用通配符进行多索引检索
    POST index*/_search

b 使用别名的方案
  • 使用别名关联已有索引
    在这里插入图片描述

  • 使用别名进行检索
    POST alias_name/_search

c 思考:使用别名和基于索引的检索效率是一样的吗?

若索引和别名指向相同,则在相同检索条件下的检索效率是一致的,因为索引别名只是物理索引的软连接的名称而已。
注意:

  • 对相同索引别名的物理索引建议有一致的映射,以提升检索效率。
  • 推荐充分发挥索引别名在检索方面的优势,但在写入和更新时还得使用物理索引。

二、分片

一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有10亿文档数据的索引占据1TB的磁盘空间,而任一节点都可能没有这样大的磁盘空间。后者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch提供了将索引划分成多分的能力,每一份就称之为分片。当创建一个索引的时候,可以指定分片的数量。每隔分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。分片的重要性,主要有两方面:

  • 允许水平分割、扩展内容容量。
  • 允许分片之上进行分布式的、并行的操作,进而提高性能和吞吐量。
    至于一个分片怎样分布,文档怎样聚合和搜索请求,是完全右Elasticsearch管理的,对于作为用户来说,这个是透明的,无需关心。

三、副本(Replicas)

在一个网络、云环境里,失败随时都可能发生,在某个分片、节点处于离线或者消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为了此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这个拷贝就叫做复制分片(副本)。

复制分片之所以重要,有两个主要原因:

  • 在分片或者节点失败的情况下,提供了可用性。所以副本分片不能与主分片在同一个节点上。
  • 扩展你的搜索量、吞吐量,因为搜索可以在所有的副本上并行运行。

总之,每个索引可以被分成多个分片。一个索引也可以被复制 0 次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。

分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。

默认情况下,Elasticsearch 中的每个索引被分片 1 个主分片和 1 个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有 1 个主分片和另外 1 个复制分片(1 个完全拷贝),这样的话每个索引总共就有 2 个分片, 我们需要根据索引需要确定分片个数。

四、分配Allocation

将分片分配给某个节点的过程,包括分配主分片或者副分片。如果是副本,还包括从主分片复制数据的过程。这个过程是由master节点完成的。

五、系统架构

在这里插入图片描述
当一个节点被选举成为主节点时, 它将负责管理集群范围内的所有变更,例如增加、
删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。 任何节点都可以成为主节点。我们的示例集群就只有一个节点,所以它同时也成为了主节点。

作为用户,我们可以将请求发送到集群中的任何节点 ,包括主节点。 每个节点都知道
任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。 Elasticsearch 对这一切的管理都是透明的。

六、故障转移

当集群中只有一个节点在运行时,意味着会有一个单点故障问题——没有冗余。 幸运的是,我们只需再启动一个节点即可防止数据丢失。当你在同一台机器上启动了第二个节点时,只要它和第一个节点有同样的 cluster.name 配置,它就会自动发现集群并加入到其中。但是在不同机器上启动节点的时候,为了加入到同一集群,你需要配置一个可连接到的单播主机列表。之所以配置为使用单播发现,以防止节点无意中加入集群。只有在同一台机器上
运行的节点才会自动组成集群。

如果启动了第二个节点,集群将会拥有两个节点 : 所有主分片和副本分片都已被分配 。
在这里插入图片描述

七、水平扩容

怎样为我们的正在增长中的应用程序按需扩容呢?当启动了第三个节点,我们的集群将会拥有三个节点的集群 : 为了分散负载而对分片进行重新分配 。
在这里插入图片描述

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

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

相关文章

Dexcap复现代码数据预处理全流程(四)——demo_clipping_3d.py

此脚本的主要功能是可视化点云数据文件&#xff08;.pcd 文件&#xff09;&#xff0c;并通过键盘交互选择演示数据的起始帧和结束帧&#xff0c;生成片段标记文件 (clip_marks.json) 主要流程包括&#xff1a; 用户指定数据目录&#xff1a;检查目录是否存在并处理标记文件 -…

安装Cockpit服务,使用Web页面管理你的Linux服务器

说起管理 Linux 服务器&#xff0c;大家首先想到的使用 SecureCRT、Xshell、MobaXterm 等工具远程到服务器&#xff0c;然后使用命令行管理服务器。今天给大家介绍一个好玩的工具&#xff0c;名字叫Cockpit&#xff0c; Cockpit 是一个免费开源的基于 web 的 Linux 服务器管理…

[A-25]ARMv8/v9-GIC的系统架构(中断的硬件基础)

ver0.1 前言 我们在观看很多的影视剧过程中,尤其是军旅体裁类型的布景中,经常会看见高级干部的办公桌上都会有几部电话机。这样的电话可不能小看,重要的事情尤其是突发和紧急的情况都要通过这几部电话第一时间通知给决策者。这几部电话,必须举报几个特点:及时性好、稳定…

13-线段的转折点样式

13-线段的转折点样式_哔哩哔哩_bilibili13-线段的转折点样式是一次性学会 Canvas 动画绘图&#xff08;核心精讲50个案例&#xff09;2023最新教程的第14集视频&#xff0c;该合集共计53集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视频内容。https://www.bi…

计算机网络 (28)虚拟专用网VPN

前言 虚拟专用网络&#xff08;VPN&#xff09;是一种在公共网络上建立私有网络连接的技术&#xff0c;它允许远程用户通过加密通道访问内部网络资源&#xff0c;实现远程办公和安全通信。 一、基本概念 定义&#xff1a;VPN是一种通过公共网络&#xff08;如互联网&#xff09…

基于transformer的目标检测:DETR

目录 一、背景介绍 二、DETR的工作流程 三、DETR的架构 1. 损失函数 2. 网络框架讲解及举例 一、背景介绍 在深度学习和计算机视觉领域&#xff0c;目标检测一直是一个核心问题。传统方法依赖于复杂的流程和手工设计的组件&#xff0c;如非极大值抑制&#xff08;nms&…

Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)

Vue Amazing UI 一个 Vue 3 组件库 使用 TypeScript&#xff0c;都是单文件组件 (SFC)&#xff0c;支持 tree shaking 有点意思 English | 中文 Vue Amazing UI 是一个基于 Vue 3、TypeScript、Vite 等最新技术栈开发构建的现代化组件库&#xff0c;包含丰富的 UI 组件和常…

C语言----指针

目录 1.概念 2.格式 3.指针操作符 4.初始化 1. 将普通变量的地址赋值给指针变量 a. 将数组的首地址赋值给指针变量 b. 将指针变量里面保存的地址赋值给另一个指针变量 5.指针运算 5.1算术运算 5.2 关系运算 指针的大小 总结&#xff1a; 段错误 指针修饰 1. con…

Python应用——将Matplotlib图形嵌入Tkinter窗口

Python应用——将Matplotlib图形嵌入Tkinter窗口 目录 Python应用——将Matplotlib图形嵌入Tkinter窗口1 模块简介2 示例代码2.1 Matplotlib嵌入Tkinter2.2 Matplotlib嵌入Tkinter并显示工具栏 1 模块简介 Tkinter是Python的标准GUI&#xff08;图形用户界面&#xff09;库&…

【linux基础I/O(2)】理解文件系统|文件缓冲区|软硬链接|动静态库

目录 前言1. 理解C语言的缓冲区2. 对文件系统的初认识3. 理解软硬链接1. 软硬链接的特征2.软硬链接的作用 4. 理解动静态库5. 总结 前言 对于文件来讲,有打开的在内存中的文件,也有没有打开的在磁盘上文件,上一篇文章讲解的是前者,本篇文章将带大家了解后者! 本章重点: 本篇文…

什么是Redis的渐进式ReHash?

文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ Redis 的渐进式 rehash 是一…

Linux应用软件编程--网络通信(udp协议,tcp协议)

网络通信&#xff1a;不同主机&#xff0c;进程间通信&#xff0c;分为广域网和局域网 OSI 七层模型&#xff1a;是一种理论模型 应用层&#xff1a;通信传输的数据内容 http、FTP、TFTP、MQTT 表述层&#xff1a;数据加密&#xff0c;解密操作&#xff0c;压缩&#xff…

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的&#xff0c;关于类与对象不才在前面笔记中有详细的介绍&#xff1a;点我…

【简博士统计学习方法】3. 统计学习方法的三要素

3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间&#xff08;Hypothesis Space&#xff09;&#xff1a;所有可能的条件概率分布或决策函数&#xff0c;用 F \mathcal{F} F表示。 若定义为决策函数的集合&#xff1a; F { f ∣ Y f ( X ) } \mathcal{F…

【llm/ollama/qwen】在本地部署qwen2.5-coder并在vscode中集成使用代码提示功能

说在前面 操作系统&#xff1a;windows11ollama版本&#xff1a;0.5.4vscode版本&#xff1a;1.96.2continue插件版本&#xff1a;0.8.66 ollama安装 访问官网&#xff0c;点击下载安装即可 默认装在了C盘&#xff0c;比较蛋疼&#xff1b;但是可以指定路径安装&#xff1a;Ol…

PHP零基础入门笔记

表达式&#xff1a;任何有值的东西就是表达式 php可以解析双引号&#xff0c;不可以解析单引号&#xff0c;双引号中引用变量可以输出引用变量的值&#xff0c;但是单引号不可以 1.变量和变量的销毁 unset(变量名) //销毁变量 变量是严格区分大小写的&#xff0c;在php中…

macos安装java8

下载 dmg方式安装 安装 双击pkg运行 输入java -version验证 配置环境变量 cd ~ ls -a输入 ls -a后查看是否已经存在.bash_profile文件&#xff0c;如果已经存在就不需要创建&#xff0c;如果不存在&#xff0c;继续执行下方命令创建文件 touch .bash_profile /usr/l…

自定义校验注解

已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解) 1.自定义注解,并在注解上指定校验逻辑 Constraint(validatedBy StateValidation.class) // 指定校验逻辑 package com.example.demo.validation;import jakarta.validation.Constraint; import j…

指代消解:自然语言处理中的核心任务与技术进展

目录 前言1. 指代消解的基本概念与分类1.1 回指与共指 2. 指代消解的技术方法2.1 端到端指代消解2.2 高阶推理模型2.3 基于BERT的模型 3. 事件共指消解&#xff1a;跨文档的挑战与进展3.1 联合模型3.2 语义嵌入模型&#xff08;EPASE&#xff09; 4. 应用场景与前景展望4.1 关键…

Chapter4.1 Coding an LLM architecture

文章目录 4 Implementing a GPT model from Scratch To Generate Text4.1 Coding an LLM architecture 4 Implementing a GPT model from Scratch To Generate Text 本章节包含 编写一个类似于GPT的大型语言模型&#xff08;LLM&#xff09;&#xff0c;这个模型可以被训练来生…