ES(Elasticsearch) 基本概念(一)

Elasticsearch作为当前最流行的开源搜索和分析引擎,广泛应用于日志分析、全文搜索、业务智能等领域。Elasticsearch是一个基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展数据存储和矢量数据库。它针对生产级工作负载的速度和相关性进行了优化。使用 Elasticsearch 可以近乎实时地搜索、索引、存储和分析各种类型和大小的数据。Kibana是 Elasticsearch 的图形用户界面。它是一款强大的工具,可用于可视化和分析数据,以及管理和监控 Elastic Stack。本文将带你系统学习Elasticsearch的核心概念和基本用法。

一、Elasticsearch基础概念

在开始实际操作前,我们需要了解几个核心概念:

  1. 文档(Document)
    1. ES是面向文档的,文档是所有可搜索数据的最小单元
    2. 文档会被序列化成JSON格式存储
    3. 每个文档都有唯一ID,可自定义或自动生成
    4. 支持数组和嵌套结构
  2. 索引(Index)
    1. 相当于MySQL中的数据库
    2. 名称必须全部小写
    3. 包含mapping(定义字段类型)和setting(定义数据分布)
  3. 节点(Node)与分片(Shard)
    1. 节点:是 一个ES实例,本质是一个Java进程
      1. Master Eligible节点:参与选主,管理集群状态
      2. Data节点:存储数据
      3. Coordinating节点:接收客户端请求
      4. 节点的名称可以通过配置文件配置,或者在启动的时候使用-E node.name=ropledata指定,默认是随机分配的。建议咱们自己指定,因为节点名称对于管理目的很重要,咱们可以通过节点名称确定网络中的哪些服务器对应于ES集群中的哪些节点;
    2. 分片:将索引水平拆分为多个部分
      1. 主分片数在创建索引时指定,后续不能修改
      2. 副本分片提供高可用性,可动态调整数量
  4. 类型:就相当于MySql里的表,我们知道MySql里一个库下可以有很多表,最原始的时候ES也是这样,一个索引下可以有很多类型,但是从6.0版本开始,type已经被逐渐废弃,但是这时候一个索引仍然可以设置多个类型,一直到7.0版本开始,一个索引就只能创建一个类型了(_doc)。 Elasticsearch7 去掉 tpye 概念ES7.x 版本:URL 中的 type 参数为可选。 ES8.x 版本:不⽀持 URL 中的 type 参数

注意:虽然在实际存储上,文档存在于某个索引里,但是文档必须被赋予一个索引下的

二、什么是倒排索引?

倒排索引(Inverted Index)是搜索引擎最核心的数据结构,也是Elasticsearch实现高效全文搜索的基础。它与我们熟悉的传统"正排索引"形成鲜明对比:

  • 正排索引(正向索引):文档文档(Document)
    • ES是面向文档的,文档是所有可搜索数据的最小单元
    • 文档会被序列化成JSON格式存储
    • 每个文档都有唯一ID,可自定义或自动生成
    • 支持数组和嵌套结构
  • 索引(Index)
    • 相当于MySQL中的数据库
    • 名称必须全部小写
    • 包含mapping(定义字段类型)和setting(定义数据分布)
  • 节点(Node)与分片(Shard)
    • 节点:一个ES实例,本质是一个Java进程
      • Master Eligible节点:参与选主,管理集群状态
      • Data节点:存储数据
      • Coordinating节点:接收客户端请求
    • 分片:将索引水平拆分为多个部分
      • 主分片数在创建索引时指定,后续不能修改
      • 副本分片提供高可用性,可动态调整数量
  • → 包含的词
    • 类似书籍的目录,通过章节找内容
    • 如:文档1包含"大话"、"西游"
  • 倒排索引(反向索引):词 → 出现的文档
    • 类似书籍的索引页,通过关键词找章节
    • 如:"西游" → 文档1、文档2、文档3...

三、倒排索引的构建过程

3.1 原始数据示例

以电影片名为例:

文档ID

电影名称

1

大话西游

2

大话西游外传

3

解析大话西游

4

西游降魔外传

5

梦幻西游独家解析

3.2 分词处理

中文需要先进行分词(使用分词器将句子拆分为词语):

  • "大话西游" → ["大话", "西游"]
  • "大话西游外传" → ["大话", "西游", "外传"]
  • "解析大话西游" → ["解析", "大话", "西游"]
  • "西游降魔外传" → ["西游", "降魔", "外传"]
  • "梦幻西游独家解析" → ["梦幻", "西游", "独家", "解析"]

3.3 构建倒排列表

对分词结果进行反向记录:

词项

文档ID列表(Posting List)

其他信息(如词频、位置等)

西游

1,2,3,4,5

在1中出现1次,在2中出现1次...

大话

1,2,3

在1中出现1次,在2中出现1次...

外传

2,4

在2中出现1次,在4中出现1次...

解析

3,5

在3中出现1次,在5中出现1次...

降魔

4

在4中出现1次

梦幻

5

在5中出现1次

独家

5

在5中出现1次

三、倒排索引的搜索过程

3.1 搜索示例:查询"独家大话西游"

  1. 查询分词
    1. "独家大话西游" → ["独家", "大话", "西游"]
  2. 查找倒排列表
    1. "独家" → 文档5
    2. "大话" → 文档1,2,3
    3. "西游" → 文档1,2,3,4,5
  3. 合并结果
    1. 文档1:包含"大话"、"西游"
    2. 文档2:包含"大话"、"西游"
    3. 文档3:包含"大话"、"西游"
    4. 文档5:包含"独家"、"西游"
    5. 文档4:只包含"西游"

相关性评分(简化版)

评分公式:

得分 = 命中词数 / 文档总词数

    1. 文档1:命中2词("大话"、"西游"),总词数2 → 2/2=1.0

    2. 文档2:命中2词,总词数3 → 2/3≈0.67

    3. 文档3:命中2词,总词数3 → 2/3≈0.67

    4. 文档5:命中2词("独家"、"西游"),总词数4 → 2/4=0.5

    5. 文档4:命中1词("西游"),总词数3 → 1/3≈0.33

结果排序

1. 大话西游 (1.0)
2. 大话西游外传 (0.67)
3. 解析大话西游 (0.67)
4. 梦幻西游独家解析 (0.5)
5. 西游降魔外传 (0.33)

基础操作

索引管理 

// 创建索引
PUT /ropledata
{"settings": {"number_of_shards": "2","number_of_replicas": "3"}
}// 删除索引
DELETE /ropledata// 修改副本数
PUT ropledata/_settings
{"number_of_replicas": "2"
}

什么是映射?

映射(Mapping)是ElasticSearch中用于定义文档及其包含字段如何存储和索引的机制。它相当于关系型数据库中的表结构定义,决定了:

  1. 哪些字段应该被当作全文检索字段
  2. 哪些字段包含数字、日期或地理位置信息
  3. 日期值的格式
  4. 自定义规则来控制动态添加字段的映射

映射的核心作用

  1. 字段类型定义:指定每个字段的数据类型(如text、keyword、integer等)
  2. 索引控制:决定字段是否被索引(可搜索)
  3. 分析器配置:指定文本字段使用的分词器
  4. 格式设置:如日期字段的格式
  5. 多字段支持:一个字段可以有不同的索引方式

映射类型

1. 显式映射

级属性映射 

用户明确定义字段的映射规则:

PUT /my-index
{"mappings": {"properties": {"age":    { "type": "integer" },  "email":  { "type": "keyword" },"name":   { "type": "text" }}}
}

多级属性映射 

PUT /my-index
{"mappings": {"properties": {"age": { "type": "integer" },"email": { "type": "keyword" },"name": { "type": "text" },"address": {"type": "nested","properties": {"street": { "type": "text" },"city": { "type": "keyword" },"zipcode": { "type": "keyword" },"coordinates": {"type": "object","properties": {"lat": { "type": "float" },"lon": { "type": "float" }}}}},"skills": {"type": "nested","properties": {"name": { "type": "keyword" },"level": { "type": "integer" },"certifications": {"type": "nested","properties": {"name": { "type": "text" },"year": { "type": "short" }}}}},"employment_history": {"type": "nested","properties": {"company": { "type": "keyword" },"position": { "type": "text" },"duration_months": { "type": "integer" }}}}}
}

这个映射定义包含:

  1. 基本字段:age(integer), email(keyword), name(text)
  2. 嵌套地址对象:包含街道(text)、城市(keyword)、邮编(keyword)和坐标对象
  3. 嵌套技能数组:包含技能名(keyword)、等级(integer)和嵌套的认证数组
  4. 嵌套工作经历数组:包含公司(keyword)、职位(text)和持续时间(integer)

所有嵌套关系都使用 "type": "nested" 来确保数组中的对象被独立索引和查询。

2. 动态映射

当索引新文档时,ES会自动检测并添加新字段:

PUT /my-index/_doc/1
{"age": 25,"email": "user@example.com","name": "John Doe"
}

ES会自动推断:

age → long

email → keyword

name → text

常用字段类型

类型

说明

text

全文检索字段,会被分词

keyword

精确值字段,不分析,用于过滤、排序和聚合

long/integer

长整型/整型数值

double/float

双精度/单精度浮点数

date

日期类型,可指定格式

boolean

布尔值

object

JSON对象

nested

嵌套对象,保持数组中对象的独立性

geo_point

经纬度坐标

映射操作示例

查看映射

GET /my-index/_mapping

添加新字段映射

PUT /my-index/_mapping
{"properties": {"employee-id": {"type": "keyword","index": false}}
}

更新映射注意事项

重要:已存在字段的映射类型不能直接修改,必须:

  1. 创建新索引并定义新映射
  2. 使用_reindex API迁移数据
POST _reindex
{"source": { "index": "old-index" },"dest": { "index": "new-index" }
}

映射参数详解

常用参数

  1. index:是否索引该字段(true/false)
  2. analyzer:指定文本分析器
  3. search_analyzer:指定搜索时分析器
  4. format:日期格式(如"yyyy-MM-dd")
  5. copy_to:将字段值复制到目标字段
  6. fields:多字段特性,允许一个字段有多种索引方式

多字段示例

{"mappings": {"properties": {"city": {"type": "text","fields": {"raw": { "type": "keyword"}}}}}
}

这样city可以用于全文搜索,city.raw可用于精确匹配和聚合。

索引数据

  1. 预先定义映射:生产环境建议预先定义映射,避免动态映射的不确定性
  2. 合理使用keyword:不需要分词的字段应设为keyword类型
  3. 控制动态映射:可通过dynamic参数控制(true/false/strict)
  4. 避免频繁修改:映射特别是字段类型不宜频繁变更
  5. 使用别名:便于重建索引时无缝切换映射是ElasticSearch高效工作的基础,合理的映射设计能显著提升搜索性能和结果的准确性。

一、数据插入操作

1. 不指定文档ID插入

Elasticsearch 会自动生成唯一ID

POST /ropledata/_doc/
{"id":1,"name":"且听_风吟","page":"https://ropledata.blog.csdn.net","say":"欢迎点赞,收藏,关注,一起学习"
}

2. 指定文档ID插入

适用于需要自定义ID的场景

POST /ropledata/_doc/101
{"id":1,"name":"且听_风吟","page":"https://ropledata.blog.csdn.net","say":"欢迎点赞,收藏,关注,一起学习"
}

二、数据删除操作

删除指定ID的文档:

DELETE /ropledata/_doc/101

三、数据更新操作

1. 全局更新(覆盖更新)

会完全替换原有文档内容

PUT /ropledata/_doc/101
{"id":1,"name":"且听_风吟","page":"https://ropledata.blog.csdn.net","say":"再次欢迎点赞,收藏,关注,一起学习"
}

2. 局部更新

只更新指定字段,性能优于全局更新

POST /ropledata/_update/101
{"doc": {"say":"奥力给"}
}

四、数据查询操作

1. 基础查询(默认返回10条)

GET /ropledata/_search

2. 带条件的全局查询

POST /ropledata/_search
{"query": {"match_all": {}},"sort": [{"id": {"order": "asc"}}]
}

五、索引重建操作

POST _reindex
{"source": { "index": "twitter" },"dest": { "index": "new_twitter" }
}

关键知识点总结

  1. 插入数据
    1. 不指定ID时ES自动生成
    2. 指定ID适用于业务关联场景
  2. 更新机制
    1. ES文档不可变,更新实质是新版本覆盖旧版本
    2. 局部更新(_update)比全局更新(PUT)性能更好
  3. 查询特点
    1. 默认返回10条结果
    2. 可通过sort参数控制排序
    3. match_all查询全部文档
  4. 版本兼容性
    1. 本文示例适用于Elasticsearch 7.x版本
    2. 6.x及以下版本语法可能有差异
  5. 性能建议
    1. 频繁更新的字段考虑单独索引
    2. 大文档更新优先使用局部更新

提示:在实际开发中,建议结合业务场景选择合适的操作方式,批量操作(Bulk API)能显著提高大批量数据处理的效率。

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

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

相关文章

当物联网“芯”闯入纳米世界:ESP32-S3驱动的原子力显微镜能走多远?

上次咱们把OV2640摄像头“盘”得明明白白,是不是感觉ESP32-S3这小东西潜力无限?今天,咱们玩个更刺激的,一个听起来就让人肾上腺素飙升的挑战——尝试用ESP32-S3这颗“智慧芯”,去捅一捅科学界的“马蜂窝”,…

Excel合并单元格后,如何自动批量生成序号列

1.选择整列 2.组合键:CtrlG 3.定位条件,选择“空值” 4.在第一个框中输入“MAX(”,鼠标选中A1框,后加“:”,鼠标选中前方“A1”,按“F4”绝对引用,补全右括号,后输入“1…

TDengine 运维—容量规划

概述 若计划使用 TDengine 搭建一个时序数据平台,须提前对计算资源、存储资源和网络资源进行详细规划,以确保满足业务场景的需求。通常 TDengine 会运行多个进程,包括 taosd、taosadapter、taoskeeper、taos-explorer 和 taosx。 在这些进程…

Axure设计数字乡村可视化大屏:从布局到交互的实战经验分享

乡村治理正从传统模式向“数据驱动”转型。数字乡村可视化大屏作为数据展示的核心载体,不仅能直观呈现乡村发展全貌,还能为决策提供科学依据。本文以Axure为工具,结合实际案例,分享如何从零设计一个功能完备、交互流畅的数字乡村大…

从零基础到最佳实践:Vue.js 系列(1/10):《环境搭建与基础概念》

Vue.js 环境搭建与基础概念 关键点 Vue.js 是一个简单易用的前端框架,适合初学者快速上手。搭建开发环境需要安装 Node.js 和 npm/Yarn,推荐使用最新 LTS 版本。Vue CLI 是官方工具,可快速创建项目并提供开发服务器。Vue.js 基于 MVVM 模式&…

使用docker compose部署dify(大模型开发使用平台)

Dify是一款生成式 AI 应用中间件,面向有私有部署与数据合规需求的企业用户,推动企业向 AI 时代转型。平台支持无代码构建,业务人员即可快速搭建与调试 AI 应用,显著降低开发门槛。 参考 https://docs.dify.ai/zh-hans/getting-s…

npm 安装时 SSL 证书过期问题笔记

问题描述: npm error code CERT_HAS_EXPIRED npm error errno CERT_HAS_EXPIRED npm error request to https://registry.npm.taobao.org/axios failed, reason: certificate has expired 这表明当前配置的 npm 镜像源(淘宝镜像 https://registry.npm.taobao.org&…

力扣HOT100之二叉树: 236. 二叉树的最近公共祖先

果然,这道题二刷还是不会做,回去看卡尔视频了。结合灵神的题解,我对这道题有了一些新的理解。 首先这道题还是用递归来做,由于我们需要计算两个节点的最近公共祖先,一定是从下往上来遍历,只有先判断左右子树…

Word 转 HTML API 接口

Word 转 HTML API 接口 图像/转换 Word 文档转换为 HTML 文件转换 / 超高精度与还原度 文件转换 / Word。 1. 产品功能 超高精度与还原度的 HTML 文件转换;支持将 Word 文档转换为 HTML 格式;支持 .doc 和 .docx 格式;保持原始 Word 文档的…

idea 安装飞算-javaAI 插件使用

文章目录 前言idea 安装飞算-javaAI 插件使用1. 介绍一下飞算-AI2. 安装使用 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的…

Bert预训练任务-MLM/NSP

MLM MLM:Masked Language Mode:在每一个训练序列中以15%的概率随机地选中某个token进行MASK,当一个token被选中后,有以下三种处理方式: 80%的概率被[MASK],如my dog is hairy->my dog is [MASK]10%的概率修改为随机的其他token,如my dog …

浏览器原生 Web Crypto API 实现 SHA256 Hash 加密

写在前面 在我上一篇文章 《node 后端和浏览器前端,有关 RSA 非对称加密的完整实践, 前后端匹配的代码演示》 中,我们使用 浏览器原生 Web Crypto API 实现了 RSA 的加密算法。 但是,在我之前的 《我设计的一个安全的 web 系统用…

5G 网络寻呼的信令及 IE 信息分析

一、寻呼信令的触发背景 在 5G 网络中,当网络侧有下行数据要发送给处于空闲态(RRC_IDLE)或非激活态(RRC_INACTIVE)的用户设备(UE)时,就会触发寻呼流程。这是因为在这些状态下,UE 与网络之间没有建立持续的无线资源控制(RRC)连接,网络需要通过寻呼机制来通知 UE 有…

印度语言指令驱动的无人机导航!UAV-VLN:端到端视觉语言导航助力无人机自主飞行

作者:Pranav Saxena, Nishant Raghuvanshi and Neena Goveas单位:比尔拉理工学院(戈瓦校区)论文标题:UAV-VLN: End-to-End Vision Language guided Navigation for UAVs论文链接:https://arxiv.org/pdf/250…

基于Zynq SDK的LWIP UDP组播开发实战指南

一、为什么选择LWIP组播? 在工业控制、智能安防、物联网等领域,一对多的高效数据传输需求日益增长。Zynq-7000系列SoC凭借其ARM+FPGA的独特架构,结合LWIP轻量级网络协议栈,成为嵌入式网络开发的理想选择。本文将带您实现: LWIP组播配置全流程动态组播组切换技术零拷贝数据…

(三)MMA(KeyCloak身份服务器/OutBox Pattern)

文章目录 项目地址一、KeyCloak二、OutBox Pattern2.1 配置Common模块的OutBox1. OutboxMessage2. 数据库配置OutboxMessageConfiguration3. 创建Save前的EF拦截器4. 创建Quartz后台任务5. 配置后台任务6. 注册服务2.2 创建OutBox的消费者1. 自定义IDomainEventHandler2. 定义抽…

初步认识HarmonyOS NEXT端云一体化开发

视频课程学习报名入口:HarmonyOS NEXT端云一体化开发 1、课程设计理念 本课程采用"四维能力成长模型"设计理念,通过“能看懂→能听懂→能上手→能实战”的渐进式学习路径,帮助零基础开发者实现从理论认知到商业级应用开发的跨越。该模型将学习过程划分为四个维度…

Vue百日学习计划Day43-45天详细计划-Gemini版

Day 43: Composable 函数基础与抽取简单逻辑 (~3 小时) 本日目标: 理解 Composable 函数的概念、优势,并学会如何将简单的、无状态的逻辑抽取为 Composable。所需资源: Vue 3 官方文档 (组合式函数): https://cn.vuejs.org/guide/reusability/composables.html 学…

C++:list容器,deque容器

list容器&#xff1a;双向链表容器&#xff0c;底层是双向链表。 简单使用如下&#xff1a; #include<iostream> #include<list> using namespace std;int main() {list<int> lst;lst.push_back(1);lst.push_back(2);lst.push_back(3);lst.push_front(4);l…

STM32之温湿度传感器(DHT11)

KEIL软件实现printf格式化输出 一般在标准C库是提供了格式化输出和格式化输入等函数&#xff0c;用户想要使用该接口&#xff0c;则需要包含头文件 #include &#xff0c;由于printf函数以及scanf函数是向标准输出以及标准输入中进行输出与输入&#xff0c;标准输出一般指的是…